#c #iterator
#c #итератор
Вопрос:
Итак, учитывая это определение функции:
void xx(list<int> my_list, list<int>::iterator start){
list<int>::iterator _start = start;
distance(my_list.begin(),_start);
}
Почему следующее приводит distance()
к зависанию внутри функции?
list<int> L;
L.push_back(0);
L.push_back(1);
xx(L, L.begin());
Я думал, что это будет просто ноль. Да, я знаю, что я отстой.
Ответ №1:
my_list
объявляется как передача по значению, это копия из аргумента. Это означает, что, учитывая distance(my_list.begin(),_start);
, my_list.begin()
и _start
указывает на два разных std::list
s, поведение не определено.
Если вы измените его на передачу по ссылке, то оба итератора указывают на одно и то же std::list
, и код будет в порядке. например
void xx(list<int>amp; my_list, list<int>::iterator start){
list<int>::iterator _start = start;
distance(my_list.begin(),_start);
}
Комментарии:
1. ХА-ХА. Вау. Сегодня я слишком долго был на терминале. Мне пора ложиться спать. Блин.
2. Пожалуйста, нажмите зеленую галочку, если это отвечает на ваш вопрос.