c ++如何在不更改其end()的情况下删除元素

问题描述 投票:0回答:4

我正在尝试按如下方法从向量中删除元素,但是为什么第一个输出与第二个输出不同?有什么办法可以避免这种情况,或者有什么更好的方法来删除元素?

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;
}
c++ vector stl
4个回答
3
投票

std::vector::end将迭代器返回到元素跟随最后一个元素,对其取消引用将导致UB,这意味着一切皆有可能,这毫无意义。

将迭代器返回到容器最后一个元素之后的元素。

此元素充当占位符;尝试访问它会导致未定义的行为。

您可以使用std::vector::end获取最后一个元素; (最好事先检查std::vector::back是否为空。)

std::vector::back

1
投票

通常不能打印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()可能会导致野生指针异常。


0
投票

尝试列表

vector::back

0
投票

如果要避免在从容器中擦除或删除项目期间避免迭代器无效,则需要重新选择容器的选择。

下面的链接可以提供迭代器无效的概述:

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)); }

© www.soinside.com 2019 - 2024. All rights reserved.