c++ stl 之容器

        c++ 标准库一个重要的特性为容器,平时项目中,在一些大型项目中容器的使用特别广泛,qt(突然想起QVariant 万能类型,这个之前的文章分享过)或者mfc其实等等都是在基础容器的基础上进行了封装,进行了功能的整合和拓展,怎么说吧,为了自身开发服务,有各种各样的容器(vector list map deque stack)等等,

        作为一名开发,必须知道常用容器的作用和应用场景,及各个的区别

        每个的优点、缺点、局限性、一些特殊属性(例如反转[怎么说呢,有轮子就没必要自己再造轮子了,划不来,自己应该关注怎么把各种轮子拼接起来,形成好每一个小模块,最后形成一个健硕的产品]);        

这里说下vector、list、map 

vecotor:连续数组,查找方便,插入和删除麻烦,因为其为连续数组,你插入一个元素,那它后面的都得后移;

list: 其实现为链表,里面存value和下一个节点的地址,插入一个元素,只需要打开链子,补充元素及可,查找比较麻烦,得根据地址依次访问遍历;

里面通过demo了解下:

list: 需要注意其的特有方法,删除头尾元素,反向迭代器;

#include <QApplication>
#include <QDebug>
#include <string>
#include <list>

using std::string;
using std::list;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    list<string> 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<string>::iterator itr;
    for(itr = myList.begin(); itr != myList.end(); itr++)
        qInfo() << QString((*itr).c_str());

    qInfo() << "=====222=====";
    //反向迭代器(方法一)
    list<string>::reverse_iterator reitr;
    for(reitr = myList.rbegin(); reitr != myList.rend(); reitr++)
        qInfo() << QString((*reitr).c_str());

    qInfo() << "=====333=====";
    //反向迭代器(方法二)
    myList.reverse();
    list<string>::iterator itr1;
    for(itr1 = myList.begin(); itr1 != myList.end(); itr1++)
        qInfo() << QString((*itr1).c_str());
    qInfo() << "=====444=====";
    //移除尾部元素
    list<string>::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 <QApplication>
#include <QDebug>
#include <string>
#include <map>

using std::string;
using std::map;
using std::make_pair;

int main(int argc, char *argv[])
{
    QApplication a(argc, argv);

    map<string, int> myMap1;
    myMap1.insert(make_pair("x", 123));
    myMap1.insert(make_pair("y", 456));
    myMap1.insert(make_pair("z", 789));
    map<string, int>::iterator itr1 = myMap1.begin();
    for(;itr1 != myMap1.end(); itr1++)
        qInfo() <<  QString(itr1->first.c_str()) << itr1->second;
    qInfo() << "***111**";
    map<string, int> myMap2;
    myMap2.insert(make_pair("a",2));
    myMap2.insert(make_pair("b", 3));
    myMap2.insert(make_pair("c", 20));
    auto itr2 = myMap2.begin();
    while (itr2 != myMap2.end())
    {
        qInfo() <<  QString(itr2->first.c_str()) << itr2->second;
        itr2++;
    }
    qInfo() << "***222**";
    for (auto temp : myMap2)
    {
        qInfo() << QString(temp.first.c_str()) << temp.second;
    }

    auto iter3 = myMap2.find("b");
    if(iter3 != myMap2.end())
        qInfo() << "b " << "finded";

            return a.exec();
}

结果如下:

其它的容器依次类推,一个某个容器常用功能清楚了,那么其它的大都类似,只有基本容器掌握了,了解了其实现机制和特性,后面算法理解起来才能相对轻松下。

=======================================================================

map插入元素时需要注意,如果已经有相同的元素,就不能再插入了(就会插入失败),这时就需要使用earse移除元素后然后插入或者使用find找到该元素然后更新里面的值,效果如下:

代码为:

#include <QCoreApplication>
#include<iostream>
#include<string>
#include <QString>
#include <QStringList>
#include <vector>
#include <map>
#include <QDebug>
using namespace std;
using std::vector;

int main(int argc, char *argv[])
{
    QCoreApplication a(argc, argv);

    map<int, string> testMap;
    testMap.insert(make_pair(1, "xx"));
    testMap.insert(make_pair(2, "yy"));

    //更新里面的值
    map<int, string>::iterator iter = testMap.find(1);
    if(iter != testMap.end()) {
        iter->second = "mm";
    }

    //遍历更新后的结果
    iter = testMap.begin();
    for(; iter != testMap.end(); iter++) {
        cout << iter->first << " " << iter->second << endl;
    }


    return a.exec();
}

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值