2015-06-04 1 views
-1

Я только что потратил ~ 2 на попытку выяснить ошибку, введенную в мой код из-за использования итерации auto для контейнеров. Я начал использовать его пару дней назад, не делая много фоновой проверки, просто потому, что мне было легче писать.Почему автоматическая итерация на C++ не может выполнять операцию над элементом, на который указывает?

У меня есть следующая карта: std::map<int, VectorList>, где VectorList всего лишь typedef std::vector<double> VectorList.

Я хотел выполнить операцию .clear() на std::vector<double>VectorList.

Я попытался следующие:

std::map<int, VectorList> map; 
for(auto elem : map) 
{ 
    elem.second.clear(); 

} 

и это не сработало. Операция очистки не выполнялась на VectorList. Однако, когда я выполнял .empty(), проверьте его, он вернет True.

Потом я вернулся к этому подходу:

for(std::map<int, VectorList>::iterator elem = map.begin(); elem != map.end(); ++elem) 
{ 
    elem->second.clear(); 
} 

И все работало, как ожидалось.


Вопрос:

Почему auto итерации не выполняет .clear() операции, как ожидалось? Может ли это быть достигнуто с помощью итерации auto?

+0

Причина для нижнего предела? – cross

ответ

3

Потому что elem создано по значению. Если вы хотите изменить значение в цикле, то цикл, используя ссылки:

for(auto& elem : map) 
+0

hah, я вижу ... вы могли бы добавить ссылку для чтения здесь для 'auto'? 15 минут дополнительного чтения стоили мне 2,5 часа глупой отладки. (Y) – cross

+0

Я заметил несколько примеров с 'for (auto && i: v)' где 'std :: vector v = {0, 1, 2, 3, 4, 5};' ... Что делает 'auto &&' там, по сравнению с вашим примером? – cross