欢迎您访问365答案网,请分享给你的朋友!
生活常识 学习资料

C++容器listvectorsetmap

时间:2023-04-21

 一、 list 

链表,双向链表,只能顺序访问,不能使用[ ](即下标)进行随机访问。

可以不分配必须的内存大小方便的进行添加和删除操作。使用的是非连续的内存空间进行存储。
   优点:(1) 不使用连续内存完成动态操作。
               (2) 在内部方便的进行插入和删除操作
               (3) 可在两端进行push、pop
   缺点:(1) 不能进行内部的随机访问,即不支持[ ]操作符和vector.at()
               (2) 相对于verctor占用内存多

list容器是双向链表,因此可以有效的在任何位置添加和删除。列表的缺点是不能随机访问内容,要想访问内容必须在列表的内部从头开始便利内容,或者从尾部开始。

void printList(list n){for(list::iterator i=n.begin();i!=n.end();i++)cout<< *i << " ";cout< list1,list2;list1.push_back(123);list1.push_back(0);list1.push_back(34); list2.push_back(100);list2.push_back(12); //测试list排序功能printList(list1); //输出 123 0 34list1.sort();printList(list1); //输出 0 34 123 list2.sort();list1.merge(list2); //两个链表排序后进行合并,合并完仍然有序printList(list1); //输出 0 12 34 100 123 return 0;}

二、vector

    向量 相当于一个数组   支持[ ]进行随机访问。
    在内存中分配一块连续的内存空间进行存储。支持不指定vector大小的存储。STL内部实现时,首先分配一个非常大的内存空间预备进行存储,即capacituy()函数返回的大小,当超过此分配的空间时再整体重新放分配一块内存存储,这给人以vector可以不指定vector即一个连续内存的大小的感觉。通常此默认的内存分配能完成大部分情况下的存储。
   优点:(1) 不指定一块内存大小的数组的连续存储,即可以像数组一样操作,但可以对此数组
               进行动态操作。通常体现在push_back() pop_back()
               (2) 随机访问方便,即支持[ ]操作符和vector.at()
               (3) 节省空间。
   缺点:(1) 在内部进行插入删除操作效率低。
               (2) 只能在vector的最后进行push和pop,不能在vector的头进行push和pop。
               (3) 当动态添加的数据超过vector默认分配的大小时要进行整体的重新分配、拷贝与释放 

std::vector矢量容器:可以随机访问容器的内容,在序列末尾添加或删除对象,但是因为是从尾部删除,过程非常慢,因为必须移动插入或删除点后面的所有对象。 

#include #include #include #include vector vec1; //vec1初始为空vector vec2(10,6);//vec2最初由10个值为6的元素vector vec3(vec2.begin(),vec2.begin()+3); //vec3最初由3个值为6的元素。//声明迭代器vector ::iterator i; //从前向后显示vec1中的数据 :迭代器输出使用 *icout<<"vec1.begin()---vec1.end():"<

三、set

特点:包含元素唯一,可用于刷选一条数列中所有不同的值。

set中的key和value是Key类型的。

set set1;for(int i=0;i<5;i++) set1.insert(i); set1.insert(1); //插入1for(set::iterator p = set1.begin();p!=set1.end();p++) { int a = *p;cout<<*p<<" "<

四、map

map中的key和value是一个pair结构中的两个分量。Map支持下表运算符operator[],用访问普通数组的方式访问map,不过下标为map的键。

#include //注意,STL头文件没有扩展名.hstd:map enumMap; //int是键的类型,string是值的类型enumMap[2] = “Two”; //插入2时,先在enumMap中查找主键为2的项,没发现,然后将一个新的对象插入enumMap,键是2,值是一个空字符串,插入完成后,将字符串赋为”Two”; 该方法会将每个值都赋为缺省值,然后再赋为显示的值,如果元素是类对象,则开销比较大。我们可以用以下方法来避免开销:enumMap.insert(map::value_type(2, "Two"));

查找并获取map中的元素:CString tmp = enumMap[2];

但是,只有当map中有2这个键的实例时才对,否则会自动插入一个实例,值为初始化值。

我们可以使用Find()和Count()方法来发现一个键是否存在。

查找map中是否包含某个关键字条目用find()方法,传入的参数是要查找的key,在这里需要提到的是begin()和end()两个成员,分别代表map对象中第一个条目和最后一个条目,这两个数据的类型是iterator.

int nFindKey = 2; //要查找的Keystd::map::iterator it= enumMap.find(nFindKey);//定义一个条目变量(实际是指针)if(it == enumMap.end()) { //没找到}else { //找到}

 通过map对象的方法获取的iterator数据类型是一个std::pair对象,包括两个数据 iterator->first 和 iterator->second 分别代表关键字和存储的数据。

//遍历:map::iterator iter;for(iter = m_AgentClients.begin(); iter != m_AgentClients.end(); ++iter){ if(iter->first=="8001") {   this->SendMsg(iter->second.pSocket,strMsg); //iter->first }}//查找:map::iterator iter=m_AgentClients.find(strAgentName);if(iter!=m_AgentClients.end()) //有重名的 {}else //没有{}//元素的个数if (m_AgentClients.size()==0)//删除map::iterator iter=m_AgentClients.find(pSocket->GetName());if(iter!=m_AgentClients.end()){ m_AgentClients.erase(iter); //列表移除}

Map, Set属于标准关联容器,使用了非常高效的平衡检索二叉树:红黑树,他的插入删除效率比其他序列容器高是因为不需要做内存拷贝和内存移动,而直接替换指向节点的指针即可。

Set和Vector的区别在于Set不包含重复的数据。Set和Map的区别在于Set只含有Key,而Map有一个Key和Key所对应的Value两个元素。

Copyright © 2016-2020 www.365daan.com All Rights Reserved. 365答案网 版权所有 备案号:

部分内容来自互联网,版权归原作者所有,如有冒犯请联系我们,我们将在三个工作时内妥善处理。