我正在尝试按如下方法从向量中删除元素,但是为什么第一个输出与第二个输出不同?有什么办法可以避免这种情况,或者有什么更好的方法来删除元素?
int main() {
vector<int> test = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
cout << *test.end() << endl;
test.erase(test.begin() + 2);
cout << *test.end() << endl;
return 0;
}
std::vector::end
将迭代器返回到元素跟随最后一个元素,对其取消引用将导致UB,这意味着一切皆有可能,这毫无意义。
将迭代器返回到容器最后一个元素之后的元素。
此元素充当占位符;尝试访问它会导致未定义的行为。
您可以使用std::vector::end
获取最后一个元素; (最好事先检查std::vector::back
是否为空。)
std::vector::back
通常不能打印vector
,因为它不是最后一个指针,而是在最后一个指针之后。该值对您无效,并可能导致异常。
int main() {
vector<int> test = {1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
cout << test.back() << endl;
test.erase(test.begin() + 2);
cout << test.back() << endl;
return 0;
}
您可以使用*test.end()
我检查了vector :: erase()的stl代码
vector::end() == vector::begin() + vector::size()
所以使用* end()可能会导致野生指针异常。
尝试列表
vector::back
如果要避免在从容器中擦除或删除项目期间避免迭代器无效,则需要重新选择容器的选择。
下面的链接可以提供迭代器无效的概述:
iterator erase(const_iterator _Where) noexcept(is_nothrow_move_assignable_v<value_type>) /* strengthened */ {
const pointer _Whereptr = _Where._Ptr;
auto& _My_data = _Mypair._Myval2;
pointer& _Mylast = _My_data._Mylast;
#if _ITERATOR_DEBUG_LEVEL == 2
_STL_VERIFY(
_Where._Getcont() == _STD addressof(_My_data) && _Whereptr >= _My_data._Myfirst && _Mylast > _Whereptr,
"vector erase iterator outside range");
_Orphan_range(_Whereptr, _Mylast);
#endif // _ITERATOR_DEBUG_LEVEL == 2
_Move_unchecked(_Whereptr + 1, _Mylast, _Whereptr);
_Alty_traits::destroy(_Getal(), _Unfancy(_Mylast - 1)); // here after move it destroy the last element.
--_Mylast;
return iterator(_Whereptr, _STD addressof(_My_data));
}