Ссылки Хранения C++ на значения в станд.:: карта

#!/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 "до предполагаемого размера выходного файла)

7
задан Fire Lancer 1 July 2009 в 11:17
поделиться

3 ответа

В стандарте ясно сказано об этом в 23.1.2 / 8 об ассоциативных контейнерах

. Элементы вставки не должны влиять на действительность итераторов и ссылок на контейнер, а члены стирания аннулируют только итераторы и ссылки на стертые элементы.

9
ответ дан 6 December 2019 в 19:41
поделиться

Карта имеет важное свойство: вставка нового элемента в карту не делает недействительными итераторы, указывающие на существующие элементы. цитата из sgi docs .

Если итераторы гарантированно не изменятся, то значения, на которые они указывают, также не могут измениться.

Навин ранее получил ответ, похожий на этот. Если в моей логике нет ошибки, то, что вы делаете, безопасно.

Редактировать 2: См. Пункт 3 в sgi docs , чтобы увидеть, как получение значения из оператора [] аналогично получению значения из итератора.

4
ответ дан 6 December 2019 в 19:41
поделиться

Да, вы можете рассчитывать на это.

// 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";
0
ответ дан 6 December 2019 в 19:41
поделиться
Другие вопросы по тегам:

Похожие вопросы: