C++中vector模拟实现中的迭代器失效问题
首先来看一组代码:
iterator insert(iterator pos, const T& x) { // 扩容 if (_finish == _end_of_storage) { size_t len = pos - _stare; reserve(capacity() == 0 ? 4 : capacity() * 2); pos = _stare + lenandroid; } iterator end = _finish - 1; while (end >= pos) { *(end + 1) = *end; --end; } *pos = x; ++_finish; return pos; }
这是关于实现insert函数的一组代码。对pos迭代器指向的位置进行插入数据。现在给出一组测试用例:
void test_vector2() { std::vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); Cao::print_container(v); /*v.insert(v.begin() + 2, 30); nPaeJih print_vector(v);*/ int x; cin >> x; auto p = find(v.begin(), v.end(), x); if (p != v.end()) { p = v.insert(p, 40); (*(p + 1)) *= 10; } Cao::print_container(v); }
来看运行结果:
p本来指向的是1的位置,但是现在却是40乘10,这就是因为迭代器失效的原因。当进行insert插入之后返回的迭代器已经不指向原来的位置。所以对insert插入之后的pos迭代器进行操作就会编程引起指向错误。所以得出,经过insert之后的迭代器就会失效。不要直接进行访问。如若访问,一定要更新失效的迭代器之后在进行访问。
修改后的代码:
void test_vector2() { std::vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); v.push_back(4); v.push_back(5); Cao::print_container(v); int x; cin >> x; auto p = find(v.begin(), v.end(), x); if (p != v.end()) { p = v.insert(p,javascript 40); (*(p + 1)) *=编程客栈 10; } Cao::print_container(v); }
对p这个迭代器进行修正,就得出了想要的结果。
因此在平时使用vector时,需要特别注意此类迭代器失效问题,因此的运行错误。
到此这篇关于C++中vector模拟实现中的迭代器失效问题的文章就介绍到这了,更多相关C++ vector迭代器失效内容请搜索编程客栈(www.devze.com)以前的文章或继续浏览下面的相关文章希望大家以后多多支持编程客栈(www.devze.com)!
精彩评论