IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> 系统运维 -> C++抽象容器类型 一 ( vector 、list) -> 正文阅读

[系统运维]C++抽象容器类型 一 ( vector 、list)

一、容器

一开始理解容器的时候,可以把容器看成库,都是提供一系列特定功能的。

二、常见的容器

STL标准模板库的分类:

    顺序容器:
            vector: 向量容器
            list  :列表容器
            deque : 双端队列容器
    
    关联容器:查询一个元素是否存在,并且有效的获取该元素数据。
            map(映射)
            set(集合)
    
    哈希容器:
            unordered_set      哈希集合
            unordered_multiset 哈希多重集合
            unordered_map      哈希映射
            unordered_multimap 哈希多重映射        

三、关于vector容器的自我生长特性


当我们定义一个vector对象输出其长度和容量时发现为:0,0;
而在我们添加元素超过一定的个数时,输出其容量发现,容量变大了。这就体现了vector的自我生长。(使用size和capacity可获取长度和容量)
具体实例如下所示:

#include <vector>
#include <iostream>
using namespace std;

int main()
{
    //定义一个vector对象
    vector< int > ivec;

    //在输出添加新的元素之前,输出元素vector对象的长度和大小
    cout << "ivec: size: " << ivec.size()
    << " capacity: " << ivec.capacity() << endl;
    
    //往容器对象中添加多次元素,查看长度和容量
    for ( int ix = 0; ix < 24; ++ix ) {
    ivec.push_back( ix );
    cout << "ivec: size: " << ivec.size()
    << " capacity: " << ivec.capacity() << endl;
    }
}

运行结果:

ivec: size: 0 capacity: 0
ivec: size: 1 capacity: 1
ivec: size: 2 capacity: 2
ivec: size: 3 capacity: 4
ivec: size: 4 capacity: 4
ivec: size: 5 capacity: 8
ivec: size: 6 capacity: 8
ivec: size: 7 capacity: 8
ivec: size: 8 capacity: 8
ivec: size: 9 capacity: 16
ivec: size: 10 capacity: 16
ivec: size: 11 capacity: 16
ivec: size: 12 capacity: 16
ivec: size: 13 capacity: 16
ivec: size: 14 capacity: 16
ivec: size: 15 capacity: 16
ivec: size: 16 capacity: 16
ivec: size: 17 capacity: 32
ivec: size: 18 capacity: 32
ivec: size: 19 capacity: 32
ivec: size: 20 capacity: 32
ivec: size: 21 capacity: 32
ivec: size: 22 capacity: 32
ivec: size: 23 capacity: 32
ivec: size: 24 capacity: 32

以上体现了容量按8字节自我生长的特点,具体生长特点由平台确定!


在使用vector,每次申请释放内存时,申请需要为每个元素调用拷贝构造函数,释放需要每个元素调用析构函数。
vector的动态自我增长频繁,则插入元素的开销就越大。

解决方法:

① 当vector开销很大时,可换成list容器
② 通过指针间接存储复杂类的对象。指向类的指针的拷贝和释放不需要调用给类的拷贝构造函数和析构函数!


三、顺序容器vector于list的基本使用


① 定义容器对象的基本方式

1)定义对象不确定容量
2)定义对象并且确定容量
3)定义对象并且确定长度同时初始化

② 定义对象,不确定容量,我们可以直接定义向量容器和列表容器的对象。如下所示:在没有确定对象的长度,那么长度为0,也就是空的。

	#include <iostream>
	#include <vector>
	#include <list>
	#include <string>
	using namespace std;
	
	int main()
	{
	    //定义一个整形向量容器对象
	    vector <int> i_vec;
	
	    //定义一个字符串列表容器对象
	    list <string> s_lis;
	
	    //没有确定长度输出长度为0
	    cout<<"i_vec的长度:"<<i_vec.size()<<endl;
	    cout<<"is_lis的长度:"<<s_lis.size()<<endl;
	
	    //没有确定长度,则为空
	    if(i_vec.empty() && s_lis.empty())
	    {
	        cout<<"两个对象都是空的!"<<endl;
	    }
	    return 0;
	}

运行结果:

i_vec的长度:0
is_lis的长度:0
两个对象都是空的!

③ 确定对象容量,以下实例确定了对象的长度为10,那么就不空!

#include <iostream>
#include <vector>
#include <list>
#include <string>
using namespace std;

int main()
{
    //定义一个整形向量容器对象,并且确定长度为10
    vector <int> i_vec(10);
    //定义一个字符串列表容器对象,并且确定长度为10
    list <string> s_lis(10);

    //没有确定长度输出长度为0
    cout<<"i_vec的长度:"<<i_vec.size()<<endl;
    cout<<"is_lis的长度:"<<s_lis.size()<<endl;
    
    //没有确定长度,则为空
    if(!(i_vec.empty()) && !(s_lis.empty()))
    {
        cout<<"两个对象都不空的!"<<endl;
    }
    return 0;
}

④确定容量 并且初始化容器对象

#include <iostream>
#include <vector>
#include <list>
#include <string>
using namespace std;

int main()
{
    //定义一个整形向量容器对象,并且确定长度为10,并且初始化为-1
    vector <int> i_vec(10,-1);

    //定义一个字符串列表容器对象,并且确定长度为10,并且初始化为"dante"
    list <string> s_lis(10,"dante");

    //没有确定长度输出长度为0
    cout<<"i_vec的长度:"<<i_vec.size()<<endl;
    cout<<"is_lis的长度:"<<s_lis.size()<<endl;

    //没有确定长度,则为空
    if(!(i_vec.empty()) && !(s_lis.empty()))
    {
        cout<<"两个对象都不空的!"<<endl;
    }

    for(int n=0; n<i_vec.size(); n++)
    {
        cout<<"i_vec["<<n<<"] = "<<i_vec[n]<<endl;
    }
    list <string> ::iterator mp;
    for(mp = s_lis.begin(); mp != s_lis.end(); mp++)
    {
        cout<<"s_lis:"<<*mp<<endl;
    }
    return 0;
}

运行结果:

i_vec的长度:10
is_lis的长度:10
两个对象都不空的!
i_vec[0] = -1
i_vec[1] = -1
i_vec[2] = -1
i_vec[3] = -1
i_vec[4] = -1
i_vec[5] = -1
i_vec[6] = -1
i_vec[7] = -1
i_vec[8] = -1
i_vec[9] = -1
s_lis:dante
s_lis:dante
s_lis:dante
s_lis:dante
s_lis:dante
s_lis:dante
s_lis:dante
s_lis:dante
s_lis:dante
s_lis:dante


⑤关于容器的容量与大小

容器的容量:最多能存储元素的个数
容器的大小:当前容器中元素的个数
容器容量的扩充:resize – 当设置的容量大小小于当前容量则容量大小保持不变。

⑥ 容器对象的比较大小

等于 不等于 小于 大于 小于等于 以及大于等于 容器的比较是指两个容器的元素之间成对进行比较 如果所有元素相等而且两个容器含有相同数目的元素 则两个容器相等否则 它们不相等 第一个不相等元素的比较决定了两个容器的小于或大于关系。
与字符串判断大小逻辑相似。

  系统运维 最新文章
配置小型公司网络WLAN基本业务(AC通过三层
如何在交付运维过程中建立风险底线意识,提
快速传输大文件,怎么通过网络传大文件给对
从游戏服务端角度分析移动同步(状态同步)
MySQL使用MyCat实现分库分表
如何用DWDM射频光纤技术实现200公里外的站点
国内顺畅下载k8s.gcr.io的镜像
自动化测试appium
ctfshow ssrf
Linux操作系统学习之实用指令(Centos7/8均
上一篇文章      下一篇文章      查看所有文章
加:2021-11-12 19:59:45  更:2021-11-12 20:02:15 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年11日历 -2024/11/15 23:28:54-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码