欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

STL容器使用常见问题整理

程序员文章站 2022-03-21 20:41:26
...

1、vector的删除

    //初始化
    vector<int> vecTest;
    vecTest.push_back(100);
    vecTest.push_back(200);
    vecTest.push_back(300);
    vecTest.push_back(400);

    //删除
    vector<int>::iterator itor;
    for (itor = vecTest.begin(); itor != vecTest.end(); ){
        if (*itor == 300) 
            itor=vecTest.erase(itor);
        else 
            itor++;
    }

    //验证
    for (itor = vecTest.begin(); itor != vecTest.end(); itor++)
    {
        cout << *itor << " ";
    }

2、map的插入

我们知道map的插入有两种方式:一种是insert,还有一种是下标访问插入;

insert操作时,如果key存在,则会插入失败,如果key不存在,就会创建这个key--value。

下标访问插入时,如果这个key存在,则更新其value,如果key不存在,则就创建这个key--value键值对。

map<int, int> mapInt;
mapInt.insert(pair<int, int>(1, 1));
mapInt.insert(pair<int, int>(2, 2));
mapInt.insert(pair<int, int>(3, 3));

//插入成功
mapInt[1] = 5;

//插入失败
mapInt.insert(pair<int,int>(1,5));

在项目中,经常会盲目的使用insert进行插入,导致不能达到预期的目的。

3、string不能赋NULL值;unordermap不会根据key值排序,insert进去的是无序的(随机乱序的),若想按插入的顺序存储直接用pair。

4、含有STL容器的结构体初始化误用memset

一、动态可变更存储长度的类都是使用指针,附加动态申请内存实现的。而动态申请的内存本身并不包含在对象的本身大小上面,在对象中保存一个指针,它能够找到动态申请的内存的地址。所以,你不管动态申请多少内存,它对象中的一个指针总能找得到你,它指针的大小不会发生改变。也就是说,它所在的结构体变量的大小也是不会改变的!
动态申请的内存不包含在对象的本身大小上,它所在结构体变量的大小是不会改变的
 

二、向量是使用名称为“_Myproxy”、“_Mynextiter”这两个指针来寻找与之相邻的值的,在我们定义一个向量时,它便初始化一个“_Myproxy”,而我的代码却在类的构造函数中对定义的结构体执行了一个清零的操作:

ZeroMemory(&m_stcStruct, sizeof(STRUCT));从而导致了向量中的“_Myproxy”丢失,虽然仍可以对其进行push_back()等其他几乎一切操作,但是这个向量缺唯独不能执行遍历者一种操作!!

迭代器报“vector iterators incompatible”错

 

三、为了实现多态机制,C++对有虚函数的对象会包含一个指向虚函数表(V-Table)的指针,当使用memset时,会把该虚函数表的指针也初始化为0,而dynamic_cast也使用RTTI技术,运行时会使用到V-Table,可此时由于与V-Table的链接已经被破坏,导致程序发生异常。

正确使用memset

 

四、每次memset,把string维护的指针弄没了。所以找不到之前的数据了,就导致内存泄露

string 作为结构体成员变量之内存泄露