C++知识点17——使用C++标准库(顺序容器vector常用操作)
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常用操作)相关推荐
- C++知识点25——使用C++标准库(容器适配器stack、queue、priority_queue)
除了vector,list,deque等常用的容器,还有根据这些常用的容器进行改造来满足特殊要求的容器,这些特殊容器的行为和常用容器很相近,也称为容器适配器. 常用的容器适配器有三个,分别是stack ...
- C++知识点19——使用C++标准库(再谈string——string的初始化、赋值、添加、删除、访问)
1.string的构造函数 string();//默认构造函数,默认初始化时调用 string (const string& str);//拷贝构造函数,拷贝初始化时调用 string (si ...
- C++知识点30——使用C++标准库(关联容器map及其初始化,赋值,查找,添加,删除与迭代器失效)
一.关联容器简介 关于顺序容器和关联容器的区别已经在博客https://blog.csdn.net/Master_Cui/article/details/107427911中提过 C++标准库中的关联 ...
- C++知识点28——使用C++标准库(再谈迭代器)
一.迭代器的种类 C++中的容器以及泛型算法会大量的使用迭代器 目前已经出现的迭代器有一下几种 1.输出迭代器 (OutputIterator) 输出迭代器类似于输出流(只能向输出流中写入数据),只能 ...
- 《C++Primer》第九章-顺序容器-学习笔记(1)-顺序容器定义与操作
<C++Primer>第九章-顺序容器-学习笔记(1) 文章目录 <C++Primer>第九章-顺序容器-学习笔记(1) 摘要 顺序容器的定义 容器元素的初始化 将一个容器初始 ...
- 快速排序(基于顺序容器vector;基于数组array)
代码1:基于顺序容器vector 1 /*2 * FILE: quick_sort_vector.cpp3 * ---------------------------4 * DATE: 2017081 ...
- 获取顺序容器vector,deque,string和array的首尾元素的方法有四个
获取顺序容器vector,deque,string和array的首尾元素的方法有四个: (1)迭代器 (2)下标 (3)front() 和 back()成员函数 (4)at()成员函数 如下所示,得到 ...
- 顺序表的插入与删除java_C++实现顺序表的常用操作(插入删出查找输出)
实现顺序表的插入,删除,查找,输出操作在C语言中经常用到.下面小编给大家整理实现代码,一起看下吧 代码如下所示: #include using namespace std; #define MAXSI ...
- C++知识点24——使用C++标准库(顺序容器deque的初始化,赋值,访问,添加,删除,交换与迭代器失效)
deque容器是双端队列,使用前,需要添加#include <deque> deque的内存结构如下: 根据上图可知,deque和vector,string稍有不同,deque的内存是分段 ...
最新文章
- 修复“-bash: locate: command not found”
- Redis的安装以及基本操作简介
- 看动画学算法之:排序-快速排序
- 3、数据类型一:strings
- Python学习笔记----基础篇10----模块2
- Fixed Function Shader
- 建立账套时,没有选择客户分类档案
- 基于51单片机的指纹考勤机密码锁系统
- 百度网盘解压显示服务器错误,百度网盘、Winrar等解压文件解压出错怎么办?
- Emotron伊尔通软启动器维修MSF-5705252C-N-AU
- 快速更换证件照底色的方法
- 通向Golang的捷径【20. 使用 Go 语言的 GAE】
- CRM学习笔记类转换工具(pojo互转)上下文中获取用户名cookie工具
- littlefs系列:Technical Specification
- “诸神之眼”——Nmap端口扫描工具使用小手册
- 国内三大制式3G网络简介及比较
- ps4饥荒联机版服务器未响应,《饥荒联机版》国服的正确打开方式,你get到吗?...
- 不同路径(一个机器人位于一个 m x n 网格的左上角)
- 10_Rapidly Exploring Random Trees_宾夕法尼亚大学机器人运动规划专项课程【学习笔记】
- 一. 知识图谱和金融领域简述