几种常见STL容器类操作

【QT】容器类 Qt容器类的基本介绍,包括顺序类容器和关联容器类,针对每种容器的接口和基本用法做了说明 阅读详情

STL容器类主要分为两种,一种是序列容器类,包括vector,list,deque等。另外一种是关联式容器,主要map,set。在实际使用过程中,主要按照数据存储的场景来选择容器。

在实际使用时,如何选择这三个容器中哪一个,应根据你的需要而定,一般应遵循下面的原则:
    1) 如果你需要高效的随机存取,而不在乎插入和删除的效率,使用vector
    2) 如果你需要大量的插入和删除,而不关心随机存取,则应使用list
    3) 如果你需要随机存取,而且关心两端数据的插入和删除,则应使用deque


//============================================================================
// Name        : CTest.cpp
// Author      : @CodingGeek
// Version     : 1.0
// Copyright   : Your copyright notice
// Description : 几种常见的STL容器学习研究
//============================================================================

#include <iostream>
#include <set>
#include <map>
#include <list>
#include <vector>
#include <deque>
#include <string>
#include <algorithm>

using namespace std;

void operatorList(void)
{
    list<string> lst_str1;
    lst_str1.push_back("1001");
    lst_str1.push_back("1002");
    lst_str1.push_front("1003");
    lst_str1.push_front("1004");
    lst_str1.sort(greater<string>());
    list<string>::iterator lst_iter = lst_str1.begin();
    for (; lst_iter != lst_str1.end(); ++lst_iter)
    {
        cout << *lst_iter << endl;
    }
    cout << "*************************" << endl;
    lst_str1.sort(less<string>());

    for (lst_iter = lst_str1.begin();
            lst_iter != lst_str1.end();)
    {
        if (*lst_iter == "1001")
        {
            lst_iter = lst_str1.erase(lst_iter);
        }
        else
        {
            lst_iter++;
        }

    }

    lst_iter = lst_str1.begin();
    for (; lst_iter != lst_str1.end(); ++lst_iter)
    {
        cout << *lst_iter << endl;
    }

    cout << "*************************" << endl;

    list<string> lst_str2;
    lst_str2.push_back("1005");
    lst_str2.push_front("1007");
    lst_str2.push_back("1004");
    lst_str2.push_back("end");

    lst_str1.merge(lst_str2);
    lst_str1.sort(less<string>());

    for (list<string>::iterator iter = lst_str1.begin(); iter != lst_str1.end(); iter++)
    {
        cout << *iter << endl;
    }
    cout << "*************************" << endl;
}

//仿函数
struct compare
{
    bool operator()(string s1, string s2)
    {
        return s1 > s2;
    }
};


void operatorSet(void)
{
    set<string, compare> set_str;
    set_str.insert("1000");
    set_str.insert("1001");
    set_str.insert("1002");
    set_str.insert("1004");
    set_str.insert("1003");

    if (!set_str.insert("1005").second) //insert faild
    {
        cout << "insert not ok" << endl;
    }


    set<string>::iterator set_iter = set_str.begin();
    string temp = "1001";
    while (set_iter != set_str.end())
    {
        if(*set_iter == temp)
        {
            set_str.erase(set_iter++);
        }
        else
        {
            ++set_iter;
        }

    }


    for (set_iter = set_str.begin(); set_iter != set_str.end(); ++set_iter)
    {
        cout << *set_iter << endl;
    }
    cout << "***************************" << endl;
}

void operatorMap(void)
{
    map<string, string, compare> map_str;
    map_str.insert(make_pair("hunan", "changsha"));
    map_str.insert(make_pair("hubei", "wuhan"));
    map_str.insert(make_pair("henan", "zhenzhou"));
    map_str.insert(make_pair("guangdong", "guangzhou"));
    map_str.insert(make_pair("beijing", "beijing"));

    for (map<string, string>::iterator iter = map_str.begin();
            iter != map_str.end(); iter++)
    {
        cout << iter->first <<":" << iter->second << endl;
    }

    cout << "***************************" << endl;
    multimap<string, string, compare> mulmap_str;
    mulmap_str.insert(make_pair("hunan", "changsha"));
    mulmap_str.insert(make_pair("hubei", "wuhan"));
    mulmap_str.insert(make_pair("henan", "zhenzhou"));
    mulmap_str.insert(make_pair("guangdong", "guangzhou"));
    mulmap_str.insert(make_pair("hubei", "xianning"));

    for (map<string, string>::iterator iter = mulmap_str.begin();
            iter != mulmap_str.end(); iter++)
    {
        cout << iter->first <<":" << iter->second << endl;
    }
    cout << "***************************" << endl;
}

void operatorVector(void)
{
    vector<string> vec_str;
    vec_str.push_back("1002");
    vec_str.push_back("1007");
    vec_str.push_back("1006");
    vec_str.push_back("1005");
    vec_str.push_back("1000");
    sort(vec_str.begin(), vec_str.end(), greater<string>());

    vector<string>::iterator vec_iter = vec_str.begin();
    while (vec_iter != vec_str.end())
    {
        if (*vec_iter == "1005")
        {
            vec_iter = vec_str.erase(vec_iter);
        }
        else
        {
            ++vec_iter;
        }

    }


    vec_iter = vec_str.begin();
    while (vec_iter != vec_str.end())
    {
        cout << *vec_iter << endl;

        ++vec_iter;
    }

    cout << "***************************" << endl;
}

void operatorDeque(void)
{
    deque<int> de_str;
    de_str.push_back(11);
    de_str.push_front(14);
    de_str.push_back(13);
    de_str.push_back(15);
    de_str.push_front(10);

    deque<int>::iterator de_iter = de_str.begin();

    sort(de_str.begin(), de_str.end(),greater<int>());

    while (de_iter != de_str.end())
    {
        if (*de_iter % 2)
        {
            de_iter = de_str.erase(de_iter);
        }
        else
        {
            de_iter++;
        }


    }


    for (de_iter = de_str.begin(); de_iter != de_str.end(); ++de_iter)
    {
        cout << *de_iter << endl;
    }

    cout << "***************************" << endl;
}



int main()
{
    operatorList();
    operatorSet();
    operatorMap();
    operatorVector();
    operatorDeque();
    return 0;
}



探索C++的工具箱:双向链表容器类list(1) 本文介绍了C++标准库中的std::list双向链表容器。std::list具有动态大小、不连续存储、支持双向迭代等特点,适合频繁插入/删除操作。文章详细讲解了list的多种构造函数(默认、填充、范围、拷贝、移动等),以及assign、push/pop、insert、erase等常用修饰函数。特别强调了emplace系列函数在直接构造对象时的性能优势。最后指出list虽在随机访问上效率不高,但在动态数据操作方面具有独特优势,建议根据具体需求选择合适的容器类型。更多list特有内容将在后续文章中展开。 阅读详情

相关推荐

深入探索C++ STL源码及其应用

STL,即标准模板库(Standard Template Library),是C++语言的核心组成部分,它提供了一套丰富的数据结构和算法集合,使得C++开发者可以在项目中以一种简洁而高效的方式进行数据操作和算法实现。STL是一组具有相同接口的模板类和函数的集合,它包括容器(Containers)、迭代器(Iterators)、算法(Algorithms)和函数对象(Functors)等核心组件。

weixin_42400643的博客 1013

STL基础4:STL7个常用容器的比较

1.STL容器分类: STL的容器可以分为以下几个大类:  一 顺序(序列)容器, 有vector, list, deque, string,stack( 适配器类), queue( 适配器类), priority queues( 适配器类) 二   关联容器,     有set, multiset, map, multimap, bitset,hash_set, hash_map, h

烂笔头的专栏 1万+

双有源桥(DAB)进阶:EPS调制策略与Matlab/Simulink仿真实践

本文深入探讨了双有源桥(DAB)的扩展移相(EPS)调制策略及其在Matlab/Simulink中的仿真实践。通过分析EPS的两种黄金调制策略——回流功率消除和电流应力优化,结合实际工程案例,展示了如何提升DAB系统的效率和性能。文章还详细介绍了Simulink模型搭建要点和关键仿真结果,为工程师提供了实用的技术参考。

weixin_33734785的博客 484

C++ STL三大常用容器

C++ STL常用容器

lihaizhen0507的博客 2286

C# .NET6 TesseractOCR 图片文字识别

在你的项目中的tessdata-main文件夹找到这几个文件,并右键->属性设置为【如果较新则复制】有几个需要用到的模型,需要生成的时候复制到输出目录中,在项目中设置即可。TesseractOCR兼容 x86 与 x64。附 :ImageUtils.RegionCropping()源码。Visual Studio 2022 社区版。下载完成后解压在你的项目中,如图所示。从官方项目中获取模型数据, 网址为。

qq_44121554的博客 3854

内网Linux服务器离线安装python包

3、将下载的依赖包和requirements.txt 拷贝到内网主机,依赖包和requirements.txt放同一级目录,进入该目录,运行指令。其实还有个更加方便的办法,联网主机装个与内网主机一样环境的虚拟机,在虚拟机中下载py包,拷贝到内网主机后就能直接安装了,省去手动下载py包的步骤。简单记录下最近遇到的一个小问题,内网主机没有内网源,处于无互联网状态,安装python包只能通过联网主机下载好后拷贝到内网主机。由于内网主机安装了多个版本的python,为了防止搞错,使用这种方式来调用pip安装。

cyc头发还挺多的博客 651

C++中STL容器总结

STL容器1、容器分类 1、容器分类 STL中通常将容器分为三类:顺序容器、关联容器和容器适配器。 1、顺序容器 是一种各元素之间有顺序关系的线性表,是一种线性结构的可序群集。顺序性容器中的每个元素均有固定的位置,除非用删除或插入的操作改变这个位置。顺序容器的元素排列次序与元素值无关,而是由元素添加到容器里的次序决定。 顺序容器包括: vector(向量)、list(列表)、deque(队列)...

EricLee23 2363

TNS-12516及ORA-12516错误解决

在客户端进行sqlplus连接报错如下: ORA-12516: TNS: 监听程序找不到符合协议堆栈要求的可用处理程序 在/home/oracle/product/10.2.0/db_1/network/log/listener.log中查看到错误如下: TNS-12516: TNS:listener could not find available handler with matchin

KEL 2万+

STL简介以及STL中的容器

STL、STL容器

fstarSea的博客 1396

卡门涡街可视化实战:从网格加密策略到动画后处理技巧

本文详细介绍了利用ANSYS Fluent进行卡门涡街可视化模拟的全流程,包括网格加密策略、求解器设置、涡街捕捉及动画后处理技巧。通过计算流体力学(CFD)方法,帮助工程师和研究人员高效模拟圆柱绕流现象,优化工程设计。

weixin_29309785的博客 414

SAP-ABAP:SAP中的用户确认对话框:深入理解与实践POPUP_TO_CONFIRM

本文深入介绍了SAP中的用户确认对话框函数POPUP_TO_CONFIRM,包括其核心参数配置、返回值处理、应用场景和最佳实践。该函数是SAP二次开发中重要的交互工具,用于关键操作前获取用户确认,防止误操作。文章详细解析了参数设置技巧,强调必须全面处理所有可能的返回值,并提供了删除数据、批量操作等典型应用场景的代码示例。同时对比了其他类似弹出函数,帮助开发者选择合适工具。正确使用该函数可提升系统安全性、改善用户体验并符合SAP设计规范。

baidu_35680696的博客 970

STL 提供的三种最基本容器

vector和built-in数组类似,它拥有一段连续的内存空间,并且起始地址不变,因此它能非常好的支持随机存取,即[]操作符,但由于它的内存空间是连续的,所以在中间进行插入和删除会造成内存块的拷贝,另外,当该数组后的内存空间不够时,需要重新申请一块足够大的内存并进行内存的拷贝。

yinxusen的专栏 1059

开发simulink 以及stm32半物理仿真碰到的问题,以及处理方法,Error:External Mode Open Protocol Connect command failed(实测有用)

串口实现的,但是在测试的时候发现,这个串口可以正常发送和接收数据,但是一旦把这个串口只让其进行版物理仿真就报错。直接刷写程序是可以的,最后查到问题了。我要实现半物理仿真,就是通过matlab实现可以直接控制stm32板子,实际上是通过xcp on。然后点击simulink上的观测按钮就可以直接和stm32平台进行通讯了。3,还是使用串口3,但是重新需要设置一下com口,因为重新插拔了一下,按照这个设置方法就可以。2,重新加载ioc文件。

pvmsmfchcs的博客 1501

Qt容器类

记录下qt框架里面的容器方法,

qq_45524532的博客 433

MATLAB - 浮动基座机器人的逆运动学

本例演示如何解决以浮动底座为模型的机器人的逆运动学问题。浮动底座机器人可以在空间中自由平移和旋转,具有六个自由度。浮动基座机器人的逆运动学问题适用于空间应用,即使用安装在浮动和致动基座上的机械臂在空间操纵物体,也适用于躯干和腿部可在空间自由移动的行走机器人。请注意,刚体树对象表示具有固定基体的刚体树。这意味着刚体树的基体在世界中具有固定的位置和方向。您可以在基体上附加一个 “浮动 ”类型的刚体关节,为具有浮动基体的机器人建模,以用于动态模拟等某些应用。

机器人控制与仿真应用 2440

ssm框架搭建

这个是一个在idea上成功跑起来的ssm框架项目,保存在这里方便以后使用直接下载

C++容器类和Qt容器类的对比

C++中容器类是属于标准模板库中的内容,有必要回顾下标准模板库。STL = Standard Template Library,标准模板库,惠普实验室开发的一系列软件的统称。从根本上说,STL是一些“容器”的集合,这些“容器”有list,vector,set,map等,STL也是算法和其他一些组件的集合。 STL被内建在编译系统之内。  在C++标准中,STL被组织为下面的

花莫弦的博客 6511

IDEA的使用指南

IDEA基于java的使用手册,可以最快速的上手,在使用中不断的丰富自己的使用技巧.

CPP(二)再接再厉:STL容器类的使用

STL容器类的目的是提高工作效率,省去了我们自己建立

李勇的专栏 788

SIMATIC S7-1200, S7-1500 PID 控制[手册]

SIMATIC S7-1200, S7-1500 PID 控制[手册]

visio安装包

Microsoft Office Visio 是一款专业的制图软件。利用经过更新的形状、协作工具和数据链接图表,创建专业级图表以简化复杂的信息。

C++ STL 容器类总结

零. 背景介绍 为什么要讲容器,因为容器是STL中最不可或缺的一部分: STL可分为容器(containers)、迭代器(iterators)、空间配置器(allocator)、配接器(adapters)、算法(algorithms)、仿函数(functors)六个部分。 对于常用的一些容器和容器适配器(可以看作由其它容器实现的容器),可以通过下表总结一下它们和相应头文件

ChenLI's blog 1186

QT5开发及实例学习之四容器类

文章目录前言一、pandas是什么?二、使用步骤1.引入库2.读入数据总结 前言 提示:这里可以添加本文要记录的大概内容: 例如:随着人工智能的不断发展,机器学习这门技术也越来越重要,很多人都开启了学习机器学习,本文就介绍了机器学习的基础内容。 提示:以下是本篇文章正文内容,下面案例可供参考 一、pandas是什么? 示例:pandas 是基于NumPy 的一种工具,该工具是为了解决数据分析任务而创建的。 二、使用步骤 1.引入库 代码如下(示例): import numpy as np import

PoroKing的博客 692

Qt容器类QList、QLinkedList和QVector类

QList< T >是迄今为止最常用的容器类,它储存给定数据类型T的一系列数值,相对于其他Qt容器类,QList被高度优化。QList< T >维护了一个指针数组,该数组存储的指针指向QList< T >存储的列表项的内容。因此它提供了基于下标的快速访问。 对于不同的数据类型,QList采取不同的存储策略: 如果T是一个指针类型或指针大小的基本类型(即该类型所占的字节数和指针类型所占的字节数相同),QList会直接将数值存储在它的数组中。 如果存储对象的指针,则该指针指

DayDayUp 1295

Qt容器类怎么使用

Qt容器类怎么使用

m0_73443478的博客 494

QT学习:容器类及QVariant类

Qt提供了一组通用的基 于模板的容器类。对比C++的标准模板库中的容器类,Qt 的这些容器更轻量、更安全并且更容易使用。 存储在Qt容器中的数据必须是可赋值的数据类型,也就是说,这种数据类型必须提供一个默认的构造函数(不需要参数的构造函数)、一个复制构造函数和一个赋值操作运算符。 这样的数据类型包含了通常使用的大多数数据类型,包括基本数据类型(如int和double等)和Qt的一些数据类型(如QString、 QDate和QTime等)。不过,Qt的QObject及其他的子类(如QWidget和Qdialo

weixin_42374938的博客 1404

C++常用STL (容器类 、容器适配器 、迭代器 和 算法)

C++常用函数、容器类 和 STL

奇妙方程式的博客 1563

C++中几种常见的顺序存储结构

  C++中的容器类包括“顺序存储结构”和“关联存储结构”,前者包括vector,list,deque等;后者包括set,map,multiset,multimap等。若需要存储的元素数在编译器间就可以确定,可以使用数组来存储,否则,就需要用到容器类了。1、vector    连续存储结构,每个元素在内存上是连续的;支持高效的随机访问和在尾端插入/删除操作,但其他位置的插入/删除操作效率低下;相当...

WONITAWONITAWONITA的博客 5244

Qt常用容器类及常用函数

Qt容器类 Qt提供了一组通用的基于模板的容器类,相比C++标准模板库,Qt的容器更轻量安全且更容易使用。同时在速度,内存消耗和内联代码等方面进行了优化。 Qt容器可存储的必须是可赋值的数据类型,也就是说这个类型必须有一个默认的构造函数、复制构造函数和一个赋值操作符。 这样的数据包含了通常使用的大部分类型,其中包括基本数据类型,和Qt的一些数据类型(比如QString)等,不过,Qt的QObject以及其他的子类(QWidget)等是不能存储在容器中的,但是可以通过Qt的QObject以及其他的子类的指针。

weixin_42753827的博客 1187
上一篇: 二维指针的使用场景
下一篇: 表驱动法在项目中的应用
CodingGeek
博客等级 码龄18年 15粉丝 31原创
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

个

红包个数最小为10个

元

红包金额最低5元

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

抵扣说明:

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

余额充值