c++ 标准库一个重要的特性为容器,平时项目中,在一些大型项目中容器的使用特别广泛,qt(突然想起QVariant 万能类型,这个之前的文章分享过)或者mfc其实等等都是在基础容器的基础上进行了封装,进行了功能的整合和拓展,怎么说吧,为了自身开发服务,有各种各样的容器(vector list map deque stack)等等,
作为一名开发,必须知道常用容器的作用和应用场景,及各个的区别
每个的优点、缺点、局限性、一些特殊属性(例如反转[怎么说呢,有轮子就没必要自己再造轮子了,划不来,自己应该关注怎么把各种轮子拼接起来,形成好每一个小模块,最后形成一个健硕的产品]);
这里说下vector、list、map
vecotor:连续数组,查找方便,插入和删除麻烦,因为其为连续数组,你插入一个元素,那它后面的都得后移;
list: 其实现为链表,里面存value和下一个节点的地址,插入一个元素,只需要打开链子,补充元素及可,查找比较麻烦,得根据地址依次访问遍历;
里面通过demo了解下:
list: 需要注意其的特有方法,删除头尾元素,反向迭代器;
#include
#include
#include
#include
using std::string;
using std::list;
int main(int argc, char *argv[])
{
QApplication a(argc, argv);
list myList;
//往前插 cba
myList.push_front("a");
myList.push_front("b");
myList.push_front("c");
//往后插 abc
// myList.push_back("a");
// myList.push_back("b");
// myList.push_back("c");
//移除尾部元素
// myList.pop_back();
//移除头部元素
// myList.pop_front();
foreach(auto str, myList)
qInfo() << QString(str.c_str());
qInfo() << "=====111=====";
//迭代器
list::iterator itr;
for(itr = myList.begin(); itr != myList.end(); itr++)
qInfo() << QString((*itr).c_str());
qInfo() << "=====222=====";
//反向迭代器(方法一)
list::reverse_iterator reitr;
for(reitr = myList.rbegin(); reitr != myList.rend(); reitr++)
qInfo() << QString((*reitr).c_str());
qInfo() << "=====333=====";
//反向迭代器(方法二)
myList.reverse();
list::iterator itr1;
for(itr1 = myList.begin(); itr1 != myList.end(); itr1++)
qInfo() << QString((*itr1).c_str());
qInfo() << "=====444=====";
//移除尾部元素
list::reverse_iterator itr2 = myList.rbegin();
if(itr2 != myList.rend()) {
qInfo() << QString((*itr2).c_str());
myList.pop_back();
}
qInfo() << "=====555=====";
foreach(auto str, myList)
qInfo() << QString(str.c_str());
return a.exec();
}
输出结果为:
map:
key,value的形式,主要知道插入元素可以使用make_pair,查找元素可以使用find,查找完后,使用是否找到,之前的文章分享过,特别需要注意查找的条件,如果是自定义的类型,自己重载等于运算符,特别需要注意找到的条件,代码如下:
#include
#include
#include
#include
结果如下:
其它的容器依次类推,一个某个容器常用功能清楚了,那么其它的大都类似,只有基本容器掌握了,了解了其实现机制和特性,后面算法理解起来才能相对轻松下。
=======================================================================
map插入元素时需要注意,如果已经有相同的元素,就不能再插入了(就会插入失败),这时就需要使用earse移除元素后然后插入或者使用find找到该元素然后更新里面的值,效果如下:
代码为:
#include
#include
#include
#include
#include
#include
#include