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当做一个容量可自动变化的数组,是的,数组,所以打算按照对数组进行排序的方法:用快速排序或是冒泡排序等算法自己写一个排 ...
随机推荐
- Oracle类型number与PG类型numeric对比和转换策略
Oracle 11g number 任意精度数字类型 http://docs.oracle.com/cd/B28359_01/server.111/b28318/datatype.htm#CNCPT3 ...
- Androidの共享登录之方案研究
由于最近公司提到了一个需求是,一个应用登录成功了,另一个自动登录. 绞尽脑汁想了好几天,看起来很容易但是想深点就漏洞百出,有的时候代码都写完了测试都成功了突然发现给一个假设就完全失效. 先前几个同事之 ...
- c++11 数值类型和字符串的相互转换
string和数值类型转换 c++11提供了to_string方法,可以方便的将各种数值类型转换为 字符串类型: std::string to_string(int value); std::stri ...
- java高级---->Thread之CompletionService的使用
CompletionService的功能是以异步的方式一边生产新的任务,一边处理已完成任务的结果,这样可以将执行任务与处理任务分离开来进行处理.今天我们通过实例来学习一下CompletionServi ...
- 使用CDN的网络访问过程
CDN是指内容分发网络,在网络各处架设节点服务器,当用户访问时,CDN系统会根据网络流量.到用户的距离等因素将请求导向离用户最近的节点上. 访问过程是: 1.用户向浏览器提供要访问的域名. 2.浏览器 ...
- 《转载》struts旅程《2》
上一篇我们简单了解了struts原理,学习SSH,第一部是傻瓜式学习法,人家怎么做就跟着怎么做就ok.我们以登录为例,Struts配置步骤总结如下(如图2.1): 图2.2 1. j ...
- R的grep和grepl
grep(pattern, x, ignore.case = FALSE, perl = FALSE, value = FALSE, fixed = FALSE, useBytes = FALSE, ...
- mysql客户端不能插入中文字符
问题:输入中文报错:Incorrect string value 步骤: 1.查看MySQL编码设置 show variables like '%character%'; 2.重新设置编码(注意:ut ...
- ibatis 中#和 $ 符号的区别
1.数据类型匹配 #:会进行预编译,而且进行类型匹配(自动确定数据类型): $:不进行数据类型匹配. 2.实现方式: # 用于变量替换(先生成一个占位符,然后替换) select * from use ...
- js常用的几个验证
/// <summary> ///1. 使用正则表达式验证 参数 是否 为数值 /// </summary> /// <param name="trNumber ...