C++ iterator validity (迭代器失效)

#include<iostream>
#include<vector>
#include<algorithm>  //for_each
using namespace std;

int main()
{
    vector<int> iVec;
    iVec.reserve(10);
    for(int i=1;i<8;i++)
    {
        iVec.push_back(i);
    }
   vector<int>::iterator iter=find(iVec.begin(),iVec.end(),3); //指向3
   cout<<*iter<<endl;

   iVec.erase(iVec.begin(),iVec.begin()+3); //数据增加或删除导致的数据迁移,元素次序发生变化
   cout<<*iter<<endl;
   iVec.insert(iVec.begin(),99);
   cout<<*iter<<":"<<&(*iter)<<endl;

   for(int i=1;i<10;i++)                    //空间扩展导致整个容器迁移,所有的iterator失效
       iVec.push_back(i*100);
   cout<<*iter<<":"<<&(*iter)<<endl;        //和上面输出相同,是因为之前的vector还没有释放

   for_each(iVec.begin(),iVec.end(),        //使用for_each() algorithm 和 lamda expression 输出整个vector
            [](int i){cout<< i << ‘,‘;});
    return 0;

    //总的来说是iterator指向的地址不会改变,变化的是值
}
时间: 2024-11-06 10:48:06

C++ iterator validity (迭代器失效)的相关文章

Iterator invalidation(迭代器失效)

一.vector 所有读操作.swap.std::swap:都不会引起迭代器失效... clear.operator=.assign:都会引起全部变量迭代器失效 reserve.shrink_to_fit:如果capacity的大小被改变了,则引起全部变量迭代器失效 erase:被删除的变量以及其后面的变量包括end()都迭代器失效 push_back.emplace_back:假如capacity的大小被改变,则引起全部变量迭代器失效.否则只是end()迭代器失效 insert.emplace

STL源码分析--迭代器总结、迭代器失效总结

Vector 1.内部数据结构:连续存储,例如数组. 2.随机访问每个元素,所需要的时间为常量. 3.在末尾增加或删除元素所需时间与元素数目无关,在中间或开头增加或删除元素所需时间随元素数目呈线性变化. 4.可动态增加或减少元素,内存管理自动完成,但程序员可以使用reserve()成员函数来管理内存. 5.迭代器失效 插入:vector的迭代器在内存重新分配时将失效(它所指向的元素在该操作的前后不再相同).当把超过capacity()-size()个元素插入vector中时,内存会重新分配,所有

STL迭代器失效总结

转自: http://blog.csdn.net/hackbuteer1/article/details/7734382             http://m.blog.csdn.net/blog/xhu_eternalcc/38355619 迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理 解成为一个指针.但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(

c++之迭代器失效

1.首先从一到题目开始谈说起迭代器失效.有时我们很自然并且自信地 用下面方法删除vector元素: #include <iostream>#include <stdio.h>#include <vector>#include <algorithm>#include <string> void del_elem(vector<string> &vec, const char * elem) { vector<string&

stl 迭代器失效

1.对于基于连续内存的容器,容器元素的增删,有可能会导致迭代器的失效.考虑: int main(int argc, char* argv[]) { vector<int> intVec; intVec.push_back(1); intVec.push_back(2); intVec.push_back(3); vector<int>::iterator iter1 = intVec.begin(); vector<int>::iterator iter2 = iter

C++: STL迭代器及迭代器失效问题

转载至:http://blog.csdn.net/wangshihui512/article/details/9791517 迭代器失效: 典型的迭代器失效. 首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效.那为什么迭代器会失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了10个元素,现在又要添加一个元素到容器中,但是内存中紧跟在这10个元素后面没有一个空闲空间,而vector的元素必须顺序存储一边索引访问,所以我们不能在内存中随便找个地方存储

map和vector的迭代器失效问题

当删除一个STL容器(比如map, vector)中的某个元素时, 会引起迭代器失效, 所以, 我们务必提高警惕. 题目: 删除map<int, int>中value为5的倍数的元素. 该题看起来很自然很简单, 实则有迭代器失效的陷阱. 如果对迭代器失效问题一无所知, 则很容易写出如下的错误代码: 1 #include <iostream> 2 #include <map> 3 using namespace std; 4 5 typedef map<int, i

vector和map的迭代器失效问题

1.vector #include <iostream> #include <string> #include <vector> using namespace std; void vectorTest() { vector<int> container; for (int i = 0; i < 10; i++) { container.push_back(i); } vector<int>::iterator iter; for (ite

stl迭代器失效

迭代器(iterator)是一个可以对其执行类似指针的操作(如:解除引用(operator*())和递增(operator++()))的对象,我们可以将它理解成为一个指针.但它又不是我们所谓普通的指针,我们可以称之为广义指针,你可以通过sizeof(vector::iterator)来查看,所占内存并不是4个字节.     首先对于vector而言,添加和删除操作可能使容器的部分或者全部迭代器失效.那为什么迭代器会失效呢?vector元素在内存中是顺序存储,试想:如果当前容器中已经存在了10个元