Сотрите элементы из одного вектора и добавьте их в другой вектор, используя do-while

0

Я пытаюсь создать функцию, которая стирает элементы из вершины вектора и добавляет их к другому нижнему дну, используя цикл do-while (while bb.begin() != bb.end()).

Я не ожидал, что он будет работать в ситуации, когда в векторе остается только один элемент, поскольку он является последним элементом. Но мой код работает даже для последнего элемента, тогда как (bb = numberSearch.end()

Как это произошло?

vector<int> numberSearch;
vector<int> numberpool;

//set init values
for (int k =0; k<6; k++)
{
    numberSearch.push_back(k);
    numberpool.push_back(k * 10);
}

//add and remove
vector<int>::iterator bb = numberSearch.begin();
do
{
    cout << "current numberSearch= " << *bb << endl;
    numberpool.push_back(*bb);
    numberSearch.erase(bb);
} while (bb != numberSearch.end());

//output
vector<int>::iterator cc = numberpool.begin();
for(; cc !=numberpool.end(); cc++)
{
    cout<< "numberpool=" <<*cc <<endl;
}

//ouput
for(; bb !=numberSearch.end(); bb++)
{
    cout<< "numberpool=" <<*bb <<endl;
}

выход выглядит следующим образом:

current numberSearch= 0  
current numberSearch= 1  
current numberSearch= 2  
current numberSearch= 3  
current numberSearch= 4  
current numberSearch= 5  
numberpool=0  
numberpool=10  
numberpool=20  
numberpool=30  
numberpool=40  
numberpool=50  
numberpool=0  
numberpool=1  
numberpool=2  
numberpool=3  
numberpool=4  
numberpool=5  
Теги:
vector
do-while

3 ответа

2
Лучший ответ

Это решение фактически недействительно, потому что вы используете итератор после удаления элемента, на который он ссылается. Следовательно, код демонстрирует неопределенное поведение. Чтобы исправить это, нужно было бы изменить строку:

numberSearch.erase(bb);

в

bb = numberSearch.erase(bb);

Что касается того, почему это (с исправлением) работает, даже если в списке находится только один элемент:

end() возвращает итератор "один за конец" вектора. То есть, это итератор сразу после последнего элемента вектора. Таким образом, он будет неравномерен первому элементу, даже в векторе, содержащем только один элемент.

0

В идеале вы должны использовать встроенные функции вместо do-while:

numberpool.insert(numberpool.end(), numberSearch.begin(), numberSearch.end());
numberSearch.erase(numberSearch.begin(), numberSearch.end());
  • 0
    Несмотря на то, что это хороший совет, он не затрагивает заданный вопрос, и поэтому будет лучше в качестве комментария, чем ответа.
  • 0
    эта встроенная функция, безусловно, имеет больше смысла
0

Итератор end() не указывает на последний элемент. Это итератор, проходящий мимо этого элемента. Следовательно, все ваши элементы удаляются.

rbegin() - это итератор, который указывает на последний элемент.

Также, как упоминалось здесь

Итераторы, указатели и ссылки, указывающие на позицию (или первое) и последующие, являются недействительными, при этом все итераторы, указатели и ссылки на элементы до позиции (или первой) гарантированно будут ссылаться на те же элементы, на которые они ссылались до вызова.

Следовательно, как было предложено, вы должны сделать bb равным возвращаемому значению функции стирания.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню