[C++]vector的基本的用法
[vector/容器/向量/动态数组]的基本的用法
容器的定义
向量/容器(Vector)是一个封装了动态大小数组的顺序容器(Sequence Container)。
跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。
- 摘自菜鸟教程
容器的初始化
为了方便查看容器的内部情况
暂且先用这个函数来输出
/*out*/
void Out(vector<int> k){
cout << "size:" << k.size() <<endl;
for(int i = 0;i < k.size();i++){
cout << k[i] << " ";
}
cout << endl;
}
容器的初始化方式有 4 种
/*define*/
vector<int>v1;
//vector<数据类型>容器名称;
vector<int>v2(10);
//vector<数据类型>容器名称(最大容量);
vector<int>v3(10,2);
//vector<数据类型>容器名称(最大容量,初始所有值);
int i[6]={0,1,2,3,4,5};
vector<int>v4(i+1,i+5);
//vector<数据类型>容器名称(数组名+n,数组名+m);
//将数组 n 到 m 赋值给容器
vector<int>v5(v4);
//vector<数据类型>容器名称(容器名称)
//将后者完全复制给前者
vector<int>v6(v4.begin(),v4.begin()+3);
//vector<数据类型>容器名称(容器指针1,容器指针2)
//把另一容器从指针1到指针2复制给容器
效果展示
效果代码
#include<bits/stdc++.h>
using namespace std;
/*out*/
void Out(vector<int> k){
cout << "size:" << k.size() <<endl;
for(int i = 0;i < k.size();i++){
cout << k[i] << " ";
}
cout << endl;
}
/*define*/
vector<int>v1;
//vector<数据类型>容器名称;
vector<int>v2(10);
//vector<数据类型>容器名称(最大容量);
vector<int>v3(10,2);
//vector<数据类型>容器名称(最大容量,初始所有值);
int i[6]={0,1,2,3,4,5};
vector<int>v4(i+1,i+5);
//vector<数据类型>容器名称(数组名+n,数组名+m);
//将数组 n 到 m 赋值给容器
vector<int>v5(v4);
//vector<数据类型>容器名称(容器名称)
//将后者完全复制给前者
vector<int>v6(v4.begin(),v4.begin()+3);
//vector<数据类型>容器名称(容器指针1,容器指针2)
//把另一容器从指针1到指针2复制给容器
int main(){
//容器初始化效果
Out(v1);
Out(v2);
Out(v3);
Out(v4);
Out(v5);
Out(v6);
return 0;
}
对应输出
size:0
size:10
0 0 0 0 0 0 0 0 0 0
size:10
2 2 2 2 2 2 2 2 2 2
size:4
1 2 3 4
size:4
1 2 3 4
size:3
1 2 3
--------------------------------
Process exited after 0.08673 seconds with return value 0
请按任意键继续. . .
容器函数
assign
这个函数时用于更新函数所有的值的
v.assign(4,2);
//v.assign(m,n);
//把 容器v 变为大小为 m 、所有值均为 n 的容器
v.assign(vi.begin(),vi.begin()+6);
//v.asssign(容器指针1,容器指针2);
//把 容器v 变成由另一容器 指针1 到 指针2 构成的容器
效果展示
效果代码
#include<bits/stdc++.h>
using namespace std;
/*out*/
void Out(vector<int> k){
cout << "size:" << k.size() <<endl;
for(int i = 0;i < k.size();i++){
cout << k[i] << " ";
}
cout << endl;
}
/*define*/
vector<int>v;
int i[6]={0,1,2,3,4,5};
vector<int>vi(i,i+6);
int main(){
/*text1*/
v.assign(4,2);
Out(v);
v.assign(5,3);
Out(v);
v.assign(2,4);
Out(v);
/*text2*/
v.assign(vi.begin(),vi.begin()+6);
Out(v);
return 0;
}
对应输出
size:4
2 2 2 2
size:5
3 3 3 3 3
size:2
4 4
size:6
0 1 2 3 4 5
--------------------------------
Process exited after 0.02439 seconds with return value 0
请按任意键继续. . .
back & front
作用是返回容器最头部(front)和尾部(back)的值
cout << vi.back() << endl;
//返回头部值
cout << vi.front() << endl;
//返回尾部值
效果展示
效果代码
#include<bits/stdc++.h>
using namespace std;
/*out*/
void Out(vector<int> k){
cout << "size:" << k.size() <<endl;
for(int i = 0;i < k.size();i++){
cout << k[i] << " ";
}
cout << endl;
}
/*define*/
int i[6]={0,1,2,3,4,5};
vector<int>vi(i,i+6);
int main(){
Out(vi);
cout << "vi.back() : " << vi.back() << endl;
//返回头部值
cout << "vi.front() : " << vi.front() << endl;
//返回尾部值
return 0;
}
对应输出
size:6
0 1 2 3 4 5
vi.back() : 5
vi.front() : 0
--------------------------------
Process exited after 0.02234 seconds with return value 0
请按任意键继续. . .
clear & empty & erase
- clear 用于清空容器
- empty 用于判断容器是否为空
- erase 用于删除容器的部分数据
cout << vi.empty();
//此时 容器vi 不为空 则返回 0(false)
vi.erase(vi.begin()+1,vi.begin()+4);
//vi.erase(vi.begin+n,vi.begin+m)
//把容器从第n+1个到第m个清除
vi.clear();
//把数组清空
cout << vi.empty();
//此时 容器vi 为空 则返回 1(true)
效果展示
效果代码
#include<bits/stdc++.h>
using namespace std;
/*out*/
void Out(vector<int> k){
cout << "size:" << k.size() <<endl;
for(int i = 0;i < k.size();i++){
cout << k[i] << " ";
}
cout << endl;
}
/*define*/
int i[6]={0,1,2,3,4,5};
vector<int>vi(i,i+6);
int main(){
Out(vi);
cout << "empty : " << vi.empty() << endl << endl;
//此时 容器vi 不为空 则返回 0(false)
cout << "After erase : " << endl;
vi.erase(vi.begin()+1,vi.begin()+4);
Out(vi);
//vi.erase(vi.begin+n,vi.begin+m)
//把容器从第n+1个到第m个清除
cout << endl;
vi.clear();
cout << "After clear : " << endl;
Out(vi);
//把数组清空
cout << "empty : " << vi.empty() << endl;
//此时 容器vi 为空 则返回 1(true)
return 0;
}
对应输出
size:6
0 1 2 3 4 5
empty : 0
After erase :
size:3
0 4 5
After clear :
size:0
empty : 1
--------------------------------
Process exited after 0.03977 seconds with return value 0
请按任意键继续. . .
pop_back & push_back & size
- pop_back 删除最后一个元素
- push_back 往最后面添加一个元素
- size 返回容器的元素个数
- capacity 返回容器所占内存
注意:
capacity 返回的是历史所扩充到最大的内存
(详细情况见效果展示)
cout << vi.size();
//返回容器元素个数
vi.pop_back();
//删除尾部元素
vi.push_back(5);
//vi.push_back(n);
//添加尾部元素 n
cout << vi.capacity();
//返回容器所占内存
效果展示
效果代码
#include<bits/stdc++.h>
using namespace std;
/*out*/
void Out(vector<int> k){
cout << "size:" << k.size() <<endl;
for(int i = 0;i < k.size();i++){
cout << k[i] << " ";
}
cout << endl;
}
/*define*/
int i[6]={0,1,2,3,4,5};
vector<int>vi(i,i+6);
int main(){
Out(vi);
cout << "size : " << vi.size() << endl;
//返回容器元素个数
cout << "capacity : " << vi.capacity() << endl;
//返回所占内存
vi.pop_back();
Out(vi);
//删除尾部元素
cout << "capacity : " << vi.capacity() << endl;
//即使删去的末尾的元素 所占内存依然不变
vi.push_back(5);
Out(vi);
//vi.push_back(n);
//添加尾部元素 n
return 0;
}
对应输出
size:6
0 1 2 3 4 5
size : 6
capacity : 6
size:5
0 1 2 3 4
capacity : 6
size:6
0 1 2 3 4 5
--------------------------------
Process exited after 0.1097 seconds with return value 0
请按任意键继续. . .
insert
用来把另一段数据插入容器
vi.insert(vi.begin()+1,6);
//vi.insert(vi.begin+m,n);
//在第 m 号元素后面添加 n
vi.insert(vi.begin()+1,3,7);
//vi.insert(vi.begin()+n,m,k);
//在第 m 号元素后面添加 n 个 m
vi.insert(vi.begin()+9,j+1,j+4);
//vi.insert(vi.begin()+m,数组名+n,数组名+k);
//在第 m 号元素后面添加数组的从 n+1号元素 到 k号元素
效果展示
效果代码
#include<bits/stdc++.h>
using namespace std;
/*out*/
void Out(vector<int> k){
cout << "size:" << k.size() <<endl;
for(int i = 0;i < k.size();i++){
cout << k[i] << " ";
}
cout << endl;
}
/*define*/
int i[6]={0,1,2,3,4,5};
int j[5]={6,7,8,9,10};
vector<int>vi(i,i+6);
int main(){
Out(vi);
vi.insert(vi.begin()+1,6);
Out(vi);
//vi.insert(vi.begin+m,n);
//在第 m 号元素后面添加 n
vi.insert(vi.begin()+1,3,7);
Out(vi);
//vi.insert(vi.begin()+n,m,k);
//在第 m 号元素后面添加 n 个 m
vi.insert(vi.begin()+9,j+1,j+4);
Out(vi);
//vi.insert(vi.begin()+m,数组名+n,数组名+k);
//在第 m 号元素后面添加数组的从 n+1号元素 到 k号元素
return 0;
}
对应输出
size:6
0 1 2 3 4 5
size:7
0 6 1 2 3 4 5
size:10
0 7 7 7 6 1 2 3 4 5
size:13
0 7 7 7 6 1 2 3 4 7 8 9 5
--------------------------------
Process exited after 0.01651 seconds with return value 0
请按任意键继续. . .
resize & reserve
- resize 控制元素个数
- reserve 调整内存大小
- 用法见效果展示
效果展示
效果代码
#include<bits/stdc++.h>
using namespace std;
/*out*/
void Out(vector<int> k){
cout << "size: " << k.size() << endl;
for(int i = 0;i < k.size();i++){
cout << k[i] << " ";
}
cout << endl;
}
/*define*/
int i[10]={0,1,2,3,4,5,6,7,8,9};
vector<int>vi(i,i+10);
int main(){
Out(vi);
vi.reserve(1);
cout << "Reserve as 1 : " << vi.capacity() << endl;
vi.reserve(100);
cout << "Reserve as 100 : " << vi.capacity() << endl;
cout << endl;
Out(vi);
vi.resize(5);
Out(vi);
//将容器元素取前五个
vi.resize(10);
Out(vi);
//若多,则补全
vi.resize(15,111);
Out(vi);
//还可以自定义补全值
return 0;
}
对应输出
size: 10
0 1 2 3 4 5 6 7 8 9
Reserve as 1 : 10
Reserve as 100 : 100
size: 10
0 1 2 3 4 5 6 7 8 9
size: 5
0 1 2 3 4
size: 10
0 1 2 3 4 0 0 0 0 0
size: 15
0 1 2 3 4 0 0 0 0 0 111 111 111 111 111
--------------------------------
Process exited after 0.02639 seconds with return value 0
请按任意键继续. . .
swap & 逻辑运算符
- vector 支持 swap(交换两个容器) 和 ==/!=/>/</...(判断两个容器是否完全相同时不计capacity)
- 这比较简单就不详细说明了
效果展示
效果代码
#include<bits/stdc++.h>
using namespace std;
/*out*/
void Out(vector<int> k){
cout << "size:" << k.size() <<endl;
cout << "capacity:" << k.capacity() <<endl;
for(int i = 0;i < k.size();i++){
cout << k[i] << " ";
}
cout << endl;
}
/*define*/
vector<int>v1(20,2);
vector<int>v2(10,2);
int main(){
v1.resize(10);
v1.reserve(100);
cout << v1.capacity() << " " << v2.capacity() <<endl;
if(v1 == v2)
cout << "Y";
else
cout << "N";
return 0;
}
对应输出
100 10
Y
--------------------------------
Process exited after 0.02306 seconds with return value 0
请按任意键继续. . .
Vector 与 iterator迭代器
基本概念
1.类模板 template
所谓类模板,实际上是建立一个通用类,其数据成员、成员函数的返回值类型和形参类型不具体指定,用一个虚拟的类型来代表。
使用类模板定义对象时,系统会实参的类型来取代类模板中虚拟类型从而实现了不同类的功能。
————CSDN博主「水无垠」
2.迭代器
迭代器(iterator)有时又称光标(cursor)是程序设计的软件设计模式
可在容器对象(container,例如链表或数组)上遍访的接口
设计人员无需关心容器对象的内存分配的实现细节。
————百度百科
标准库为每一种标准容器(包括vector)定义了一种迭代器类型。
迭代器类型提供了比下标操作更一般化的方法:
所有的标准库容器都定义了相应的迭代器类型,而只有少数的容器支持下标操作。
因为迭代器对所有的容器都适用,现代C++程序更倾向于使用迭代器而不是下标操作访问容器元素,即使对支持下标操作的vector类型也这样。
————CSDN博主「seadplus」
使用方法
- 定义
vector<int>::iterator it_v;
//vector<容器类型>::iterator 迭代器名称;
- 赋值
it_v = v.begin();
//常有的就是begin函数
//其余的后再赋值讲
- 读取
cout << *it_v << endl;
//迭代器用法和指针类似
//用 * 来读取迭代器所指的值(可直接更改里面的值)
- 运算
vector<int>::iterator it_mid = v.begin() + v.size()/2;
/*
begin指向的是开始的地址
size是容器的长度
加上size的一半
就正好指向容器的中间位置
*/
cout << *(it_mid + 3) << endl;
/*
迭代器同样可以和数字相加
代表指向 往前(+) 或者 往后(-) 走这么多个元素
*/
效果展示
效果代码
#include<bits/stdc++.h>
using namespace std;
//define
int i[9] = {1,2,3,4,5,6,7,8,9};
vector<int> v(i,i+9);
int main(){
//输出容器
for(vector<int>::iterator it_v = v.begin();it_v != v.end();it_v++){
cout << *it_v << " ";
}
cout << endl;
//mid
vector<int>::iterator it_mid = v.begin() + v.size()/2;
cout << *it_mid << endl;
//add
cout << *(it_mid + 3) << endl;
return 0;
}
对应输出
1 2 3 4 5 6 7 8 9
5
8
--------------------------------
Process exited after 0.01405 seconds with return value 0
请按任意键继续. . .
[C++]vector的基本的用法的更多相关文章
- ArrayList Vector LinkedList 区别与用法
转载自: http://www.cnblogs.com/mgod/archive/2007/08/05/844011.html 最近用到了,所以依然是转载 ArrayList 和Vector是采用数组 ...
- Arraylist Vector Linkedlist区别和用法 (转)
ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实际存储的数据以便增加和插入元素,都允许直接序号索引元素,但是插入数据要设计到数组元素移动等内存操作,所以索引数据快插入数据慢 ...
- C++ vector容器类型的用法及注意
转自http://www.cnblogs.com/charley_yang/archive/2010/12/11/1903040.html vector类为内置数组提供了一种替代表示,与string类 ...
- 【转】ARRAYLIST VECTOR LINKEDLIST 区别与用法
转自:http://www.cnblogs.com/mgod/archive/2007/08/05/844011.html ArrayList 和Vector是采用数组方式存储数据,此数组元素数大于实 ...
- vector的erase的用法
vector<string>::iterator it = v.erase(v.begin() + 3, v.begin() + 6); 可以直接从begin进行加减,比如我们要移除第3个 ...
- L3-002 特殊堆栈 (30分) vector容器的模拟、vector容器的一些用法
vector容器的简单应用,我们可以用vector维护一个有序数组,每次对要插入的数用upper_bound或者lower_bound来 为这个数找一个应该插入到vector的位置.另外再找一个数组来 ...
- vector最最最基础用法(非原创)
在c++中,vector是一个十分有用的容器,下面对这个容器做一下总结. 1 基本操作 (1)头文件#include<vector>. (2)创建vector对象,vector<in ...
- vector erase的错误用法
直接写 a.erase(it)是错误的,一定要写成it=a.erase(it)这个错误编译器不会报错.而且循环遍历删除的时候,删除了一个元素,容器里会自动向前移动,删除一个元素要紧接着it--来保持位 ...
- STL—Vector简介
有关C++ STL 中的vector向量的用法(代码示例) 一. 简介 Vector是一个称为向量的顺序容器(不明白顺序容器与关联容器的可以Google). 二. 特点 1. 动态(相当于一个动态数组 ...
- vector::erase returns incompatible iterator in debug build
关于std::vector中erase的用法http://www.cplusplus.com/reference/vector/vector/erase/ #include <vector> ...
随机推荐
- Jenkins主从架构的实现
一.概要 提到K8S环境下的CI/CD,可以使用的工具有很多,比如Jenkins.Gitlab CI.新兴的drone等,考虑到大多公司在VM环境下都采用 Jenkins 集群来搭建符合需求的 CI/ ...
- 简单了解下最近正火的SwissTable
去年看到字节跳动给golang提了issue建议把map的底层实现改成SwissTable的时候,我就有想写这篇博客了,不过因为种种原因一直拖着. 直到最近遇golang官方开始讨论为了是否要接受Sw ...
- 看element源码学到的小技巧
中午无休的时候有点无聊, 看了一下昨天clone 的 element-ui 源码, 发现很多优雅之处, 记录一下让我直接用到项目中的一个点 那就是绝对定位的元素放到body 里面的 同级.这么做的好处 ...
- 在不修改代码情况下解决 Chrome 浏览器跨域
前言: 在前后台分离的项目,跨域是经常遇到的问题了.是实际解决方案中,大部分采用服务端配置,而如果只是调试,可以通过配置 Chrome 浏览器实现跨域,以下以 NodeJs 服务为例. 开始: 1. ...
- 《最新出炉》系列初窥篇-Python+Playwright自动化测试-11-playwright操作iframe-上篇
1.简介 原估计宏哥这里就不对iframe这个知识点做介绍和讲解了,因为前边的窗口切换就为这种网页处理提供了思路,另一个原因就是虽然iframe很强大,但是现在很少有网站用它了.但是还是有小伙伴或者童 ...
- 【日常踩坑】从 SSLEOFError 到正确配置 Proxy
目录 踩坑 代理服务器 普通的代理服务器 因国家法律规定,部分内容已删除,完整内容请查看文章末尾链接 代理配置 追根溯源 urllib3 pip 万恶之源 urllib 参考资料 本文主要参考 Pyt ...
- 全免费开源-国内搭建ChatGPT个人镜像站与维护全攻略
本教程收集于:AIGC从入门到精通教程汇总 全免费开源,仅需一个域名就可以部署国内的ChatGPT镜像版本. One-Click to deploy well-designed ChatGPT web ...
- 文心一言 VS 讯飞星火 VS chatgpt (83)-- 算法导论8.1 4题
四.用go语言,假设现有一个包含n个元素的待排序序列.该序列由 n/k 个子序列组成,每个子序列包含k个元素.一个给定子序列中的每个元素都小于其后继子序列中的所有元素,且大于其前驱子序列中的每个元素. ...
- 2023-08-30:用go语言编写。两个魔法卷轴问题。 给定一个数组arr,其中可能有正、负、0, 一个魔法卷轴可以把arr中连续的一段全变成0,你希望数组整体的累加和尽可能大。 你有两个魔法卷轴,
2023-08-30:用go语言编写.两个魔法卷轴问题. 给定一个数组arr,其中可能有正.负.0, 一个魔法卷轴可以把arr中连续的一段全变成0,你希望数组整体的累加和尽可能大. 你有两个魔法卷轴, ...
- UI自动化项目1说明 | 网页计算器自动化测试项目
需求: 1.对网页计算器, 进行加法的测试操作. 通过读取数据文件中的数据来执行用例. 2.网址: http://cal.apple886.com/ 测试点: 1.加法:1+1=2 2+9!=10 . ...