c++顺序容器

c++顺序容器

最近在学习c++,做点笔记以便以后查看。

概述

容器顾名思义就是一些特定类型的对象集合,为程序员提供了控制元素和访问顺序的能力。这种顺序不依赖于元素的值。所有顺序容器都提供了快速顺序访问的能力

STL标准库,表列出以下方面的不同

  • 向容器添加或从容器中删除元素的代价
  • 非顺序访问容器元素的代价
容器类型容器介绍优缺点
vector可变大小数组支持快速随机访问。在尾部之外的位置插入或删除元素可能很慢
deque双端队列支持快速随机访问在头尾位置插入/删除速度很快
list双向链表只支持双向顺序访问在list中任意位置进行插入/删除速度很快
forward_list单向链表在链表任意位置进行插入/删除速度很快
array固定大小数组支持快速随机访问。不能添加或删除元素
string与vector类似的容器专门用于保存字符。随机访问快。在尾部插入/删除速度快

使用方法

想要使用容器必须先导入相应的头文件。

#include <vector>
#include <list>
#include <deque>

共同方法

    以下容器操作是所有容器类型都支持的

容器操作操作说明
类型别名
iterator此容器类型的迭代器类型
const_iterator可以读取元素,但不能修改元素的迭代器类型
size_type无符号整数类型,足够保存此种容器类型最大可能容器的大小
difference_type带符号整数类型,足够保存两个迭代器之间的距离
value_type元素类型
reference元素的左值类型;与value_type&含义相同
const_reference元素的左值类型;与value_type&含义相同
构造函数
C c;默认构造函数,构造空容器
C c1(c2);构造c2的拷贝c1
C c1(b, e);构造c,将迭代器b和e指定的范围内的元素拷贝到c (arrary不支持)
C c{a, b, c…};列表初始化c
赋值与swap
c1 = c2;将c1中元素替换为c2中的元素
c1 ={a,b,c…};将c1中元素替换为列表中的元素(不适用于array)
a = swap(b)交换a和b的元素
swap(a,b)与a.swap(b)等价
大小
c.size()c中元素的数目 (不支持forward_list)
c.max_size()c可保存的最大元素的数目
c.empty()判断c中是否存储了元素
添加/删除元素(不适用于array)
c.insert(args)将args的元素拷贝进c
c.emplace(inits)适用inits构造c中的一个元素
c.erase(args)删除args指定的元素
c.clear删除c中的所有元素,返回void
关系运算符
==, !=所有容器都支持相等(不等)运算符
<, <=, > , >=关系运算符(无序关联容器不支持)
获取迭代器
c.begin(),c.end()返回指向c的首元素和尾元素之后位置的迭代器
c.cbegin(),c.cend()返回const_iterator
反向容器的额外成员(不支持forward_list)
reverse_iterator按逆序寻址元素的迭代器
const_reverse_iterator不能修改元素的逆序迭代器
c.rbegin(), c.rend()返回指向c的尾元素和首元素之前位置的迭代器
c.crbegin(), c.crend()返回const_reverse_iterator

用法实例

按照《c++ Primer》书中作者的介绍,我们在选取容器时基本上遵循以下基本原则:

  • 除非你有很好的理由选择其他容器,否则应使用vector.
  • 如果你的程序有很多小的元素,且空间的额外开销很重要,则不要使用list或forward_list.
  • 如果程序要求随机访问元素,应使用vector或deque.
  • 如果程序要求在容器的中间插入或删除元素,应使用lis或forward_list。
  • 如果程序需要在头尾位置插入或删除元素,但不会在中间位置进行插入或删除操作,则使用deque.
  • 如果程序只有在读取输入时才需要在容器中间位置插入元素,随后需要随机访问元素,则先将数据添加到vector中,在调用STL标准库的sort函数进行排序。如果必须在中间插入元素,考虑在输入阶段使用list,一旦输入完成,将list中的内容拷贝到一个vecctor中。

以下是vector容器的简单用法。

    //1.初始化vector
    vector<int> vec1;
    vector<int> vec2(vec1);
    vector<int> vec3(vec1.begin(),vec1.end());
    vector<int> vec4(10);
    vector<int> vec5(10,4);
    //2.常用操作方法
    vec1.push_back(100);//添加元素
    int size = vec1.size();//元素个数
    bool isEmpty = vec1.empty();//判断是否为空
    cout << vec1[0] << endl;// 输出:100
    vec1.insert(vec1.end(),5,3);//在vec1尾部中添加5个元素,每个添加的元素都是3
    vec1.pop_back();//将最后一个元素移除
    vec1.erase(vec1.begin(),vec1.end());
    cout << (vec1 == vec2) ? true : false;
    vector<int>::iterator iter = vec1.begin();
    vec1.clear();
    //3.遍历
    int length = vec1.size();
    for (int i = 0; i < length; i++) {
        cout << vec1[i];
    }
    cout << endl << endl;
    //迭代器
    vector<int>::const_iterator iterator = vec1.begin();
    for (; iterator != vec1.end(); iterator++) {
        cout << *iterator;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值