c++常见容器操作

总结下常见c++容器操作。

1.Vector、 list和 deque
Vector是数组,List 是双端链表,deque时双向队列。分别引入vector/list/deque库。

vector、deque支持随机访问和迭代器偏移,list、deque支持双向访问,list只能自加自减。

push_back、insert

push_front 【vector不可用】

resize 【list不可用】

pop_back、erase

pop_front 【vector不可用】

resize 【list不可用】

下标、迭代器 【list不可用下标】

front、back 【vector不可用front】

演示如下:

//Vector -- 数组
//List -- 双端链表 多了些自己的merge、split、find操作
//deque --双向队列
void VectorAndListShow()
{
cout << "=============vector" << endl;
vector<int> v;

//push_back-增加
v.push_back(12);
v.push_back(13);
v.push_back(14);
v.insert(v.begin(), 15);

//下标方式遍历
for (int i=0; i<v.size(); i++)
{
cout << v[i] << " " << endl;
}

//迭代器方式遍历
for (vector<int>::iterator iter= v.begin(); iter!=v.end(); iter++)
{
cout << *iter << " " << endl;
}

//erase-删除,注意更新迭代器
vector<int>::iterator iter = v.begin();
iter = v.erase(iter);//删除后迭代器返回的是下一个元素,此时要更新迭代器
cout << "first value after delete:" << *iter <<endl;

//pop_back-删除
v.pop_back();

//reserve/resize-容量
v.reserve(50);
cout << "Capacity" << v.capacity() << endl; //Capacity 总分配空间大小
cout << "Size" << v.size() << endl; //size 程序已经占用的空间大小
v.resize(10);
cout << "Capacity" << v.capacity() << endl;
cout << "Size" << v.size() << endl;

cout << "=============list" << endl;
list<int> l;

//push_front/push_back-前增
l.push_front(10);
l.push_front(12);
l.push_front(13);
l.push_front(14);

for (list<int>::iterator iter=l.begin(); iter != l.end(); iter++)//只能用!=,不能用<
{
cout << *iter << "-";
}
cout << endl;

//front/back-访问首尾
cout << l.front() << endl;
}

2.stack、 queue、 priority_queue

这三种容器都是前面叙述的容器的包装容器,stack、queue默认使用deque实现,priority_queue默认使用vector实现,分别引入stack和queue库。可以更换默认的包装容器。

【a】.stack-后进(push)先出(pop)

支持push/pop/top/empty

如下,使用list容器来实现stack

//stack-后进(push)先出(pop)
stack<int, list<int> > s;//注意里面的<>和外面的<>分离
s.push(1);
s.push(2);
s.push(3);
s.push(4);
s.push(5);

while(!s.empty())
{
int si = s.top();
s.pop();
cout << si << " " << endl;
}

【b】.queue-先进(push)先出(pop)

支持push/pop/front/top/empty

如下

//queue-先进(push)先出(pop)
queue<int> q;
q.push(1);
q.push(2);
q.push(3);
q.push(4);
q.push(5);

while(!q.empty())
{
int si = q.front();//或back
q.pop();
cout << si << " " << endl;
}

【c】.priority_queue-支持优先级的队列,可以自定义优先级

支持push/pop/top/empty

如下,实现数字越小则优先级越高,越先输出的队列

priority_queue<int, vector<int>, less<int>> pq;
pq.push(18);
pq.push(22);
pq.push(31);
pq.push(48);
pq.push(52);

while(!pq.empty())
{
int si = pq.top();//不能用front和back
pq.pop();
cout << si << " " << endl;
}

3.map、 set、 multimap 和multiset

本质上map和set都是hash实现,可以实现复杂度为O(1)的查找和插入复杂度,分别引入map和set库。

【a】.map和set基本操作

支持 insert/erase/count/find

演示如下:

map<int, string> m;

//[]下标操作,没有的会新建
for (int i=0; i<4; i++)
{
m[i] = string("12345");
}

//直接插入,make_pair需要引入ulity库
m.insert(make_pair(11, "11"));
m.insert(make_pair(12, "12"));
m.insert(make_pair(13, "13"));
m.insert(make_pair(14, "14"));

//遍历输出
for (map<int,string>::iterator iter=m.begin(); iter!=m.end(); iter++)
{
cout << iter->first << "->" << iter->second.c_str() << endl;
}

//删除
int nCnt = m.erase(11);//删除键值为11的,返回值为本次删除的元素个数,一定是1
cout << nCnt << endl;

map<int,string>::iterator delEnd = m.begin();
delEnd++;//delEnd不能加,只能自增
m.erase(m.begin(), delEnd);//只删除,不返回值

//查找
int n = m.count(13);//对应值的个数,0或1
cout << "The count of 13 is:" << n << endl;
map<int,string>::const_iterator iter = m.find(13);//返回对应元素的迭代器
cout << iter->first << "find is" << iter->second.c_str() << endl;

//set 和map类似,用于记录单一数据,快速查询
set<int> s;
s.insert(1);
s.insert(2);
s.insert(3);
s.insert(4);

cout << s.count(5) << endl;

【b】.multimap和multiset
对于multimap和multiset,可存在多个相同的key

相同的key在存储上位置一定是连续的,因此才有如下3种访问指定key元素的方法:

//指定值的全部元素 find+count
multimap<int,int>::iterator iterFind = mm.find(3);
for (int i=0; i<mm.count(3); i++, iterFind++)
{
cout << iterFind->first << "==>>" << iterFind->second << endl;
}

//指定值的全部元素 lower_bound和upper_bound
multimap<int,int>::iterator iterBegin = mm.lower_bound(3);
multimap<int,int>::iterator iterEnd = mm.upper_bound(3);
while (iterBegin!=iterEnd)
{
cout << iterBegin->first << " ==>> " << iterBegin->second << endl;
iterBegin++;
}

//指定值的全部元素 equal_range
pair<multimap<int,int>::iterator,multimap<int,int>::iterator> iterPos = mm.equal_range(3);
while (iterPos.first!=iterPos.second)
{
cout << iterPos.first->first << " ==>> " << iterPos.first->second << endl;
iterPos.first++;
}
————————————————
版权声明:本文为CSDN博主「文大侠」的原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接及本声明。
原文链接:https://blog.csdn.net/wenzhou1219/article/details/51533059

原文地址:https://www.cnblogs.com/mjgw/p/12618517.html

时间: 2024-08-06 10:35:31

c++常见容器操作的相关文章

几种常见 容器 比较和分析

几种常见 容器 比较和分析 hashmap, map, vector, list ...hash&n list支持快速的插入和删除,但是查找费时; vector支持快速的查找,但是插入费时. map查找的时间复杂度是对数的,这几乎是最快的,hash也是对数的. 如果我自己写,我也会用二叉检索树,它在大部分情况下可以保证对数复杂度,最坏情况是常数复杂度,而std::map在任何情况下都可以保证对数复杂度,原因是它保证存诸结构是完全二叉检索树,但这会在存诸上牺牲一些时间. STL 中的 map 内部

容器技术Docker 容器操作大总结

Docker实战之容器操作: 新建容器: docker create创建的容器处于停止状态,可以使用docker start命令启动Docker容器. 使用docker run命令,可以创建一个运行中的容器. create命令与容器运行模式相关的选项: -a,--attach=[]                                      是否绑定到标准输出.输入和错误 -a,--detach=true|false                              是否在

c#常见stream操作

常见并常用的stream一共有 文件流(FileStream), 内存流(MemoryStream), 压缩流(GZipStream), 加密流(CrypToStream), 网络流(NetworkStream): 1.文件流(读取文件流-输出文件流)FileStream using(Streamstreamwrite=new FileStream(@"D:\BaiduYunDownload\45.avi",FileMode.OpenOrCreate)) { using (Stream

【足迹C++primer】38、关联容器操作(2)

关联容器操作(2) map的下标操作 map的下标操作 map和unordered_map容器提供了下标运算符合一个对应的at函数 对于一个map使用下标操作,其行为与数组或vector上的下标操作很不相同: 使用一个不再容器中的关键字作为下标,会添加一个此关键字的元素到map中 map和unordered_map的下标操作 c[k] 返回关键字为k的元素,如果关键字k不再c中,添加一个关键字为k的元素,对其进行值初始化 c.at(k) 访问关键字为k的元素,带参数检测,如果k不再c重那么返回一

Windows下常用的100个CMD指令以及常见的操作

Windows下常用的100个CMD指令以及常见的操作 常用的100个CMD指令 gpedit.msc-–组策略 2. sndrec32---录音机 3. Nslookup---IP地址侦测器 ,是一个 监测网络中 DNS 服务器是否能正确实现域名解析的命令行工具. 它在 Windows NT/2000/XP 中均可使用 , 但在 Windows 98 中却没有集成这一个工具. 4. explorer---打开资源管理器 5. logoff---注销命令 6. shutdown---60秒倒计时

【足迹C++primer】26、顺序容器操作

顺序容器操作 向顺序容器添加元素 forward_list //有自己专有版本的insert和emplace: forward_list //不支持push_back和emplace_back vector, string //不支持push_front和emplace_front c.push_back(t), c.emplace_back(args) //在c的尾部创建一个值为t的或者由args创建的元素,返回void c.push_front(t), c.emplace_back(args

java常见文件操作

收集整理的java常见文件操作,方便平时使用: //1.创建文件夹 //import java.io.*; File myFolderPath = new File(str1); try { if (!myFolderPath.exists()) { myFolderPath.mkdir(); } } catch (Exception e) { System.out.println("新建目录操作出错"); e.printStackTrace(); } //2.创建文件 //impor

【足迹C++primer】38、关联容器操作(1)

关联容器操作 关联容器中还定义了三个类型,如下: set<string>::value_type v1; //这个v1是string类型 set<string>::key_type v2; //这个v2是string类型 map<string, int>::value_type v3; //v3是pair类型pair<const string, int> map<string, int>::key_type v4; //v4是string类型 m

Redis学习笔记(字符串类型常见命令操作)

Redis字符串类型常见命令操作 存取数据 存字符串类型数据: 取字符串类型数据: 当键不在的时候会返回空 如果重复向一个键中存数据,后存储的数据会覆盖前存储的数据 递增数字 当存的字符串是整数形式的时候,Redis提供一个: INCR命令    作用:让当前键值递增,并返回递增后的值 当要递增的键值不存在的时候,redis会自动存入这个键,默认值为0,并把值递增 键的命名 键名Redis没有强制要求,一般命名形式为: 对象类型:对象ID:对象属性 例如: user:1:name  使用这个来存