STL容器之容器基本操作和删除成员需注意的陷阱

2019-10-11

STL容器之容器基本操作和删除成员需注意的陷阱

vector

查找

vector没有find()成员函数,其find是依靠algorithm来实现的

1
2
#include <algorithm>
vector<int>::iterator it = find(vec.begin(), vec.end(), 6);

删除

使用vector.erase(迭代器)删除成员,如果是循环注意指针陷阱

注意:remove不是vector的成员函数,而是中实现

remove(v.begin(), v.end(), 99);

参考: STL Vector remove()和erase()的使用

remove只是将成员前移,原来的位置的值还在。 e.g. 9 10 8 7, remove 10则变成9 8 7 7

从一个容器中remove元素不会改变容器中元素的个数

如果你真的要删除东西的话,你应该在remove后面接上erase。

v.erase(remove(v.begin(), v.end(), 99), v.end()); // 真的删除所有等于99的元素

把remove的返回值作为erase区间形式第一个参数传递很常见,这是个惯用法。事实上,remove和erase是亲密联盟,这两个整合到list成员函数remove中。这是STL中唯一名叫remove又能从容器中除去元素的函数:

对于list,调用remove成员函数比应用erase-remove惯用法更高效

1
2
3
4
5
list<int> li;   // 建立一个list
    // 放一些值进去
li.remove(99);   // 除去所有等于99的元素:
    // 真的删除元素,
    // 所以它的大小可能改变了

list

1
2
3
4
5
6
7
8
9
遍历,使用迭代器,不能使用下标
iter = list1.begin(); != end(); iter++

List.push_back(info);  添加到末尾
List.pop_back();       删除末尾元素
List.pop_front();      删除第一个元素

iter = List.insert(iter, info);  插入后iter指向新插入的元素
iter = std::find(List.begin(), List.end(), info);  查找

map

迭代器遍历

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
//错误
for(iter=begin; ...; iter++)
{
    erase(iter)
}
//错误
for(iter=begin; ...; )
{
    erase(iter)
    iter++
}

//正确
for(iter=begin; ...; )
{
    erase(iter++)
}

:
temp = iter;
iter++;
erase(temp);

//分支
for(vector<int>::iterator iter=veci.begin(); iter!=veci.end(); )
{
    if(*iter == 3)
        iter = veci.erase(iter);
    else
        iter ++ ;
}

新增记录

1
2
3
4
(1) map的变量名[key] = value;
(2) PeopleMap.insert(map<int, string>::value_type(111, zhang wu ));
(3) PeopleMap.insert(pair<int, string>(222, "zhang liu"));      //常用的
(4) PeopleMap.insert(make_pair<int, string>(222, "zhang liu")); //常用的

  • 本文作者: xiaodongQ
  • 本文链接: /2019/10/11/stl-op-trap/
  • 版权声明: 本文可以自由拷贝,转载,请注明出处,谢谢! 🤝

Comments