Добрый день, коллеги!
Столкнулся со странным поведением проги на простейшем коде (под MS Visual Studio 2010 Professional). Помогите разобраться!
Есть код
std::vector<SSegmHeader> hdr_arr(hdr_list.begin(), hdr_list.end());
std::vector<SSegmHeader> hdr_arr_phone;
for (size_t i=0; i<hdr_arr.size(); i++)
{
if (hdr_arr[i].state==0)
hdr_arr_phone.push_back(hdr_arr[i]);
}
Перед циклом вектор hdr_arr имеет 80 элементов, после цикла новый вектор hdr_arr_phone имеет 28 элементов. Тут все ОК. Мистика начинается дальше.
Если убрать операторные скобки от for'а, т.е. сделать его таким:
for (size_t i=0; i<hdr_arr.size(); i++)
if (hdr_arr[i].state==0)
hdr_arr_phone.push_back(hdr_arr[i]);
то цикл (под дебаггером) выполняется только 1 раз, для нулевого элемента вектора условие выполняется, делается push_back и на этом все заканчивается, hdr_arr_phone имеет только 1 скопированный элемент.
Если же добавить к if'у пустой else:
for (size_t i=0; i<hdr_arr.size(); i++)
if (hdr_arr[i].state==0)
hdr_arr_phone.push_back(hdr_arr[i]);
else
{
}
то опять все работает, как должно.
Ести еще одна странность: переменная i в этом коде объявляется первый раз по телу функции. Дальше есть другие аналогичные объявления i, но это первое. И все последующие объявления именно такие — в теле цикла.
Тем не менее в неправильно работающем (среднем) варианте после выхода из цикла дебаггер показывает значение i=0 (а не пишет, что она out-of-scope или не определена). Это, конечно, может быть причудой дебаггера, но сам ход исполнения меня приводит в полное недоумение.
Что я делаю не так?