c++标准库vector&list使用练习
/*
vector顺序存储,随机访问快
list链表存储,插入删除快
deque占用内存多,兼具两者优点
注意:
1.vector严格顺序存储
2.list的迭代器只能做++或--运算,要一次移动多个位置使用advance(iterator,offset)
3.注意迭代器失效问题
4.尤其注意list的删除时接收新地址的问题
*/
#include<iostream>
#include<vector>
#include<list>
using namespace std;
void DisplayVector(vector<int> &v){
cout << "capacity:" << v.capacity() << endl;//capacity 为不重新分配内存下vector能容纳的元素个数
cout << "size:" << v.size() << endl;//size是vector当前有的元素个数
cout << "elements:" << endl;
for (int i = 0; i < v.size(); i++){
cout << i<<':'<<v[i] << '\t';
}
cout << endl;
}
void DisplayList(list<int> &l){
list<int>::iterator ite = l.begin();
for (ite; ite != l.end(); ite++){
cout << distance(l.begin(),ite) << ":" << *ite << '\t';
}
cout << endl;
}
int main(){
//声明空vector
vector<int>v;
DisplayVector(v);
//五个元素均为66,第二个参数不写默认是零
vector<int> v1(5,66);
DisplayVector(v1);
//v2的size为5,v2被初始化为a的5个值。后一个指针要指向将被拷贝的末元素的下一位置。
int a[5] = { 0, 1, 2, 3, 3 };
vector<int> v2(a, a + 5);
/*
//at()函数返回指定位置的值并可判断是否越界。在visual studio 中会引发中断异常
for (int i = 0; i < v1.size() + 1; i++){
v1.at(i) = i;
//v1[i] = i;
cout << v1.at(i) << '\t';
}
cout << endl;
*/
//push_back在vector后面插入新值,重新分配内存,pop_back删除末尾的元素
for (int i = 0; i < 10; i++){
v2.push_back(i);
}
DisplayVector(v2);
//判断vector是否为空
cout << "v.empty()=" << v.empty() << endl;
//迭代器访问vector
vector<int>::iterator ite = v2.begin();
for (ite; ite != v2.end(); ite++){
cout << *ite << '\t';
}
cout << endl;
//利用insert向vector中插入元素
ite = find(v2.begin(), v2.end(), 5);
v2.insert(ite, 3, 666);
v2.insert(v2.begin() + 3, 2, 333);
DisplayVector(v2);
//清空v2中的元素
v2.clear();
DisplayVector(v2);
/*
插入位置的迭代器一般最好为:
begin()或 end()返回的
STL 算法(如find函数)的返回位,find可用于查找元素,然后在这个位置插入另一个元素(这将导致查找的元素向后移).
事实是size()为0的vector插入位置如果写begin()+pos或者end()+pos,均会报越界错误。
不太懂的是既然capacity不为零,说明已经分配好了空间,为什么会有越界错误。
也许是因为vector是严格要求顺序存储。
当然要想在头尾插入最好用deque,用法和vector基本相同。
要想在数组中频繁插入删除,使用list。
*/
//初始化list
list<int>l1(10);
list<int>l2(10, 66);
DisplayList(l2);
//声明迭代器
list<int>::const_iterator con_ite_list;
list<int>::iterator ite_list=l2.begin();
//插入元素,头尾插入同vector、deque,
//list的迭代器不是随机访问迭代器,是链表中的指针,只能ite++或者ite--
//要运算list的迭代器,使用advance(ite,offset),注意不要越界
advance(ite_list, 5);
l2.insert(ite_list, 555);
DisplayList(l2);
//删除元素,可见插入后迭代器仍指向原来指向的元素而不是位置,而vector插入后迭代器则指向新插入的元素,也就是原来的位置
//注意警惕erase陷阱,删除后接收新的地址值。
ite_list=l2.erase(--ite_list);
DisplayList(l2);
//list排序,默认升序,降序可以vector.reverse()反转
l2.insert(++l2.begin(), 555);
l2.sort();
DisplayList(l2);
//二维vector,不再赘述,参考https://blog.csdn.net/a819825294/article/details/52088732
vector<vector<int>> num;
getchar();
return 0;
}
c++标准库vector&list使用练习的更多相关文章
- 把《c++ primer》读薄(3-2 标准库vector容器+迭代器初探)
督促读书,总结精华,提炼笔记,抛砖引玉,有不合适的地方,欢迎留言指正. 标准库vector类型初探,同一种类型的对象的集合(类似数组),是一个类模版而不是数据类型,学名容器,负责管理 和 存储的元素 ...
- c/c++ 标准库 vector
c/c++ 标准库 vector 标准库 vector的小例子 test1~test7 #include <iostream> #include <vector> using ...
- C++标准库vector类型的使用和操作总结
vector是一种类型对象的集合,它是一种顺序容器,容器中的所有对象必须都是同一种类型.想了解顺序容器的更多内容:C++顺序容器知识总结.vector的对象是可以动态生长的,这说明它在初始化时可以不用 ...
- C++ Primer 有感(标准库vector及迭代器)
vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存.引入头文件 #include<vector> 1.vecto ...
- C++标准库vector以及迭代器
今天看C++的书,出现了一个新的概念,容器vector以及容器迭代器. vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存. ...
- C++标准库vector及迭代器
vector是同一种对象的集合,每个对象都有一个对应的整数索引值.和string对象一样,标准库将负责管理与存储元素相关的类存.引入头文件 #include<vector> 1.vecto ...
- C++标准库vector类型详解
Vector简介 vector是定义在C++标准模板库,它是一个多功能.能够操作多种数据结构和算法的模板类(关于模板类我们后面会介绍,如何创建自己的模板类).vector是一个容器,能够像容器一样存放 ...
- C++之标准库vector
目录 1.成员函数 2.元素访问 3.迭代器iterator 4.容量capacity 5.修改函数 std::vector是一个封装动态数组的序列容器 std::pmr::vector是一个使用多态 ...
- C++标准库 vector排序
前天要做一个对C++ STL的vector容器做一个排序操作,之前一直把vector当做一个容量可自动变化的数组,是的,数组,所以打算按照对数组进行排序的方法:用快速排序或是冒泡排序等算法自己写一个排 ...
随机推荐
- java基础---->java调用oracle存储过程
存储过程是在大型数据库系统中,一组为了完成特定功能的SQL 语句集,存储在数据库中,经过第一次编译后再次调用不需要再次编译,用户通过指定存储过程的名字并给出参数(如果该存储过程带有参数)来执行它.今天 ...
- 图论之最短路径(2)——Bellman-Ford算法
继续最短路径!说说Bellman—Ford算法 思路:假设起点为s,图中有n个顶点和m个边,那么它到任一点(比如i)的最短路径 最多可以有n-1条(没有回路就是n-1条):因为最短路径中不可能包含回路 ...
- 配置Python实战开发环境
一.安装Python和easy_install 和pip 新版本的linux下面应该带有这些环境,没有自带的话可以查找google配置. 二.配置python运行的虚拟化环境: 好处:Python的库 ...
- WCF(五) 深入理解绑定
适用于本机WCF-WCF交互性能最佳的绑定: 允许跨主机,但只能用于部署同一台主机上,不能访问命名管道 netNamePipeBinding总结 一 WCF与SOA SOA是一种通过为所有软件提供服务 ...
- mac必备软件
LigthPaper:Markdown工具 ssh工具:ShellCraft
- log file sync 事件(转)
log file sync log file sync等待时间发生在redo log从log buffer写入到log file期间. 下面对log file sync做个详细的解释. 何时发 ...
- Hive sql语法详解
Hive 是基于Hadoop 构建的一套数据仓库分析系统,它提供了丰富的SQL查询方式来分析存储在Hadoop 分布式文件系统中的数据,可以将结构 化的数据文件映射为一张数据库表,并提供完整的SQ ...
- php中的魔术方法(Magic methods)和魔术常亮
PHP中把以两个下划线__开头的方法称为魔术方法,这些方法在PHP中充当了举足轻重的作用. 魔术方法包括: __construct(),类的构造函数 __destruct(),类的析构函数 __cal ...
- 写出gradle风格的groovy代码
写出gradle风格的groovy代码 我们先来看一段gradle中的代码: buildscript { repositories { jcenter() } dependencies { class ...
- HDU_3193_Find the hotel
Find the hotel Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)To ...