#!/bin/bash
tot=$(wc -c /proc/$/fd/255 | awk '/ /{print $1}')
now() {
echo $(( 100* ($(awk '/^pos:/{print $2}' < /proc/$/fdinfo/255)-166) / (tot-166) )) "%"
}
now;
now;
now;
now;
now;
now;
now;
now;
now;
вывод:
0 %
12 %
25 %
37 %
50 %
62 %
75 %
87 %
100 %
примечание: если вместо 255 вы введете 1, вы будете контролировать стандарт на ... с 2 на выходе стандарта (но вы должны изменить источник для установки " tot "до предполагаемого размера выходного файла)
В стандарте ясно сказано об этом в 23.1.2 / 8
об ассоциативных контейнерах
. Элементы вставки не должны влиять на действительность итераторов и ссылок на контейнер, а члены стирания аннулируют только итераторы и ссылки на стертые элементы.
Карта имеет важное свойство: вставка нового элемента в карту не делает недействительными итераторы, указывающие на существующие элементы. цитата из sgi docs .
Если итераторы гарантированно не изменятся, то значения, на которые они указывают, также не могут измениться.
Навин ранее получил ответ, похожий на этот. Если в моей логике нет ошибки, то, что вы делаете, безопасно.
Редактировать 2: См. Пункт 3 в sgi docs , чтобы увидеть, как получение значения из оператора [] аналогично получению значения из итератора.
Да, вы можете рассчитывать на это.
// retrieve reference to string stored at "x"
// note that since [] returns a reference, it must insert an element at "x" if
// it doesn't exists (in this case an empty string)
std::string &a= map["x"];
// retrieve reference for "x" again and set value to "foo"
map["x"] = "foo";
// use already stored reference
a = "bar";