C++STL中的容器类型分为两种,一种是顺序容器,另一种是关联容器,这两种容器之所以被划分,本质区别是顺序容器可以通过元素在容器中的位置进行访问及存储,而关联容器只能通过键来访问和存储元素

顺序容器常用的主要有以下几个:vector(可变数组),string(字符数组),list(双向链表),deque(双端队列),这几个容器都定义在各自的头文件中,头文件名与容器名相同

1.vector(可变数组)

最最常用的容器,可随机访问,插入和删除元素较list慢

vector概述见C++知识点4——vector与string简述

1.1 vector的赋值

vector的赋值除了使用列表赋值

和别的vector对象赋值,还可以使用assign操作,assign的操作方式有以下三种

template <class InputIterator>
void assign (InputIterator first, InputIterator last);

这种操作接受的是两个输入迭代器,将迭代器范围内的元素赋值给容器

void assign (size_type n, const value_type& val);

这种操作接受的是n个val,将n个val赋值给容器

void assign (initializer_list<value_type> il);

这种操作接受的是一个初始化列表,将列表中的元素赋值给容器

具体使用如下:

int main(int argc, char const *argv[])
{vector<int> v1(10,3);v1.assign(10,6);for (auto i:v1) {cout<<i<<endl;}cout<<"------------------------"<<endl;v1.assign({1,2,3,4,5});for (auto i:v1) {cout<<i<<endl;}cout<<"------------------------"<<endl;vector<int> v2(10,4);v1.assign(v2.begin()+3,v2.end());for (auto i:v1) {cout<<i<<endl;}return 0;
}

上述三种赋值操作将vector内的元素值擦除并替换

1.2 交换两个vector

交换两个vector可以使用swap函数

void swapope()
{vector<int> v1={1,2,3};vector<int> v2={4,5,6};for (int i=0;i<v1.size();++i) {cout<<v1[i]<<','<<&v1[i]<<endl;}cout<<"------------------------"<<endl;for (int i=0;i<v2.size();++i) {cout<<v2[i]<<','<<&v2[i]<<endl;}swap(v1,v2);cout<<"after swap"<<endl;for (int i=0;i<v1.size();++i) {cout<<v1[i]<<','<<&v1[i]<<endl;}cout<<"------------------------"<<endl;for (int i=0;i<v2.size();++i) {cout<<v2[i]<<','<<&v2[i]<<endl;}
}

可见,交换前后,两个容器仅仅只是换个名字,容器里的元素没被移动,所以,swap之后,容器的迭代器仍然有效,仍然指向swap之前的那些元素

因为swap仅仅是交换名字,所以对于常用的顺序容器来说,swap不进行任何的拷贝,删除,添加操作,处理时间为常数

1.3 添加元素

vector常用的添加元素的方法处理push_back(尾部添加)外,还有insert方法,insert方法的重载有以下四种:

1.在迭代器position指向元素之前插入一个值为val的元素,返回指向val的迭代器

iterator insert (const_iterator position, const value_type& val);

示例:

void insertope()
{vector<int> v1={1,2,3};vector<int>::iterator it=v1.insert(v1.begin()+1,66);for (auto i:v1) {cout<<i<<endl;}cout<<*it<<endl;
}

v1.begin()+1指向第二个元素,所以在第二个元素的前面位置上插入66,返回的迭代器也指向66

2.在迭代器position指向元素之前插入n个值为val的元素,返回指向第一个val的迭代器

iterator insert (const_iterator position, size_type n, const value_type& val);

示例

void insertope()
{vector<int> v1={1,2,3};vector<int>::iterator it=v1.insert(v1.begin()+1,5,66);for (auto i:v1) {cout<<i<<endl;}cout<<*it<<','<<*(--it)<<endl;
}

3.在迭代器position指向元素之前插入迭代器first和last范围内的元素,返回指向新添加第一个元素的迭代器

template <class InputIterator>
iterator insert (const_iterator position, InputIterator first, InputIterator last);

示例

void insertope()
{vector<int> v1={1,2,3};vector<int> v2={4,5,6};vector<int>::iterator it=v1.insert(v1.begin()+1,v2.begin()+1,v2.end());for (auto i:v1) {cout<<i<<endl;}cout<<*it<<','<<*(--it)<<endl;
}

4.在迭代器position指向元素之前插入列表范围内的元素,返回指向新添加第一个元素的迭代器

iterator insert (const_iterator position, initializer_list<value_type> il);

示例

void insertope()
{vector<int> v1={1,2,3};vector<int> v2={4,5,6};vector<int>::iterator it=v1.insert(v1.begin()+1,{11,22,33});for (auto i:v1) {cout<<i<<endl;}cout<<*it<<','<<*(--it)<<endl;
}

1.4 访问元素

除了使用迭代器和下标进行元素访问,还有三个方法可以访问vector中的元素

1 at方法,返回下标为n的引用

reference at (size_type n);
const_reference at (size_type n) const;
void atfunc()
{vector<int> v(10);for (int i=0;i<v.size();++i) {v.at(i)=i;//调用reference at (size_type n);}for (int i=0;i<v.size();++i) {cout<<v.at(i)<<endl;//调用const_reference at (size_type n) const;}
}

2 back方法,返回尾元素的引用

reference back();
const_reference back() const;

3.front方法,返回头元素的引用

reference front();
const_reference front() const;

示例

void backandfrontfunc()
{vector<int> v1={1,2,3};v1.front()-=v1.back();//1-3cout<<v1.front()<<endl;//返回引用,所以v1.front()变为-2v1.back()-=v1.front();//3-(-2)cout<<v1.back()<<endl;for (auto i:v1) {cout<<i<<endl;}
}

上述这些方法访问是要确保vector对象中不为空,且索引n不能越界

1.4 删除元素

除了pop_back用来删除尾元素之外(使用pop_back前,一定要判断vector对象不为空),还有clear方法用来删除vector中的所有元素,还有重载方法erase删除vector中的指定元素

1 clear函数,清楚所有的vector中的元素

void clear();

2.erase函数,删除迭代器指向的元素,返回被删除元素之后元素的迭代器

iterator erase (iterator position);
void erasefunc()
{vector<int> v1={1,2,3};vector<int>::iterator it=v1.erase(v1.begin()+1);for (auto i:v1) {cout<<i<<endl;}cout<<*it<<endl;
}

it指向3

3.erase函数,删除迭代器范围内的元素,返回最后一个被删除元素之后元素的迭代器

iterator erase (iterator first, iterator last);
void erasefunc()
{vector<int> v1={1,2,3,4,5,6};vector<int>::iterator it=v1.erase(v1.begin()+2, v1.begin()+4);for (auto i:v1) {cout<<i<<endl;}cout<<*it<<endl;
}

删除了3和4,最后it指向5

参考

http://www.cplusplus.com/reference/vector/vector/

《C++ Primer》

欢迎大家评论交流,作者水平有限,如有错误,欢迎指出

C++知识点17——使用C++标准库(顺序容器vector常用操作)相关推荐

  1. C++知识点25——使用C++标准库(容器适配器stack、queue、priority_queue)

    除了vector,list,deque等常用的容器,还有根据这些常用的容器进行改造来满足特殊要求的容器,这些特殊容器的行为和常用容器很相近,也称为容器适配器. 常用的容器适配器有三个,分别是stack ...

  2. C++知识点19——使用C++标准库(再谈string——string的初始化、赋值、添加、删除、访问)

    1.string的构造函数 string();//默认构造函数,默认初始化时调用 string (const string& str);//拷贝构造函数,拷贝初始化时调用 string (si ...

  3. C++知识点30——使用C++标准库(关联容器map及其初始化,赋值,查找,添加,删除与迭代器失效)

    一.关联容器简介 关于顺序容器和关联容器的区别已经在博客https://blog.csdn.net/Master_Cui/article/details/107427911中提过 C++标准库中的关联 ...

  4. C++知识点28——使用C++标准库(再谈迭代器)

    一.迭代器的种类 C++中的容器以及泛型算法会大量的使用迭代器 目前已经出现的迭代器有一下几种 1.输出迭代器 (OutputIterator) 输出迭代器类似于输出流(只能向输出流中写入数据),只能 ...

  5. 《C++Primer》第九章-顺序容器-学习笔记(1)-顺序容器定义与操作

    <C++Primer>第九章-顺序容器-学习笔记(1) 文章目录 <C++Primer>第九章-顺序容器-学习笔记(1) 摘要 顺序容器的定义 容器元素的初始化 将一个容器初始 ...

  6. 快速排序(基于顺序容器vector;基于数组array)

    代码1:基于顺序容器vector 1 /*2 * FILE: quick_sort_vector.cpp3 * ---------------------------4 * DATE: 2017081 ...

  7. 获取顺序容器vector,deque,string和array的首尾元素的方法有四个

    获取顺序容器vector,deque,string和array的首尾元素的方法有四个: (1)迭代器 (2)下标 (3)front() 和 back()成员函数 (4)at()成员函数 如下所示,得到 ...

  8. 顺序表的插入与删除java_C++实现顺序表的常用操作(插入删出查找输出)

    实现顺序表的插入,删除,查找,输出操作在C语言中经常用到.下面小编给大家整理实现代码,一起看下吧 代码如下所示: #include using namespace std; #define MAXSI ...

  9. C++知识点24——使用C++标准库(顺序容器deque的初始化,赋值,访问,添加,删除,交换与迭代器失效)

    deque容器是双端队列,使用前,需要添加#include <deque> deque的内存结构如下: 根据上图可知,deque和vector,string稍有不同,deque的内存是分段 ...

最新文章

  1. 修复“-bash: locate: command not found”
  2. Redis的安装以及基本操作简介
  3. 看动画学算法之:排序-快速排序
  4. 3、数据类型一:strings
  5. Python学习笔记----基础篇10----模块2
  6. Fixed Function Shader
  7. 建立账套时,没有选择客户分类档案
  8. 基于51单片机的指纹考勤机密码锁系统
  9. 百度网盘解压显示服务器错误,百度网盘、Winrar等解压文件解压出错怎么办?
  10. Emotron伊尔通软启动器维修MSF-5705252C-N-AU
  11. 快速更换证件照底色的方法
  12. 通向Golang的捷径【20. 使用 Go 语言的 GAE】
  13. CRM学习笔记类转换工具(pojo互转)上下文中获取用户名cookie工具
  14. littlefs系列:Technical Specification
  15. “诸神之眼”——Nmap端口扫描工具使用小手册
  16. 国内三大制式3G网络简介及比较
  17. ps4饥荒联机版服务器未响应,《饥荒联机版》国服的正确打开方式,你get到吗?...
  18. 不同路径(一个机器人位于一个 m x n 网格的左上角)
  19. 10_Rapidly Exploring Random Trees_宾夕法尼亚大学机器人运动规划专项课程【学习笔记】
  20. 一. 知识图谱和金融领域简述

热门文章

  1. 亚信产业互联网生态亮相2016南京软博会
  2. Project Euler 50 Consecutive prime sum
  3. mysql主从状态异常解决办法
  4. Oracle 好书 02 ( 安装oracle 10g软件及创建数据库 )
  5. c#导出包含图片的word文档
  6. 《卫生信息基本数据集编制规范》等23项行业标准的通告
  7. Slide:11g新特性-在线实施补丁online patching
  8. 基于SSM实现商户管理系统
  9. 线性表的链式表示——双链表
  10. MySQL:实用 SQL 语句集合