STL—vector

举报
辰chen 发表于 2022/06/14 23:29:29 2022/06/14
【摘要】 文章目录 一、什么是vector二、vector的操作1.vector的定义2.vector内元素的访问(1)通过下标访问(2)通过迭代器访问 3.vector中的函数(1)push_bac...


一、什么是vector

vector就是边长数组,相比较与数组我们需要提前规定它的容量,它可以根据运算自动改变数组的长度,我们在平时写题的时候可能会遇到爆内存的情况,这就是我们数组长度开太长的结果,在这个时候我们就可以用vector去存储

我们在使用vector的时候,需要添加头文件#include <vector>


二、vector的操作

1.vector的定义

vector<typename> name;

  
 
  • 1

typename可以是任意的数据类型,当然也可以是STL中的其他容器,例如vectorset,queuename的话就是你给这个vector数组起的名字,比如我们可以起名叫a,当然也可以是其他的名字,下面是几个vector的例子

vector<int> a;
vector<double> b;
vector<char> c;
vector<vector<int>> v;   //这里如果报错的话,写成如下样子:
vector<vector<int> > v;
//报错原因是C++11以前的编译器会把这个翻译成移位操作

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6

2.vector内元素的访问

(1)通过下标访问

和数组的访问一致,对于

vector<int> a;

  
 
  • 1

来讲,我们可以直接通过v[0]v[1]进行访问,注意这里的下标是从0 ~ v.size() - 1v,size()是v内的元素数量,后面我们会进行讲述.

(2)通过迭代器访问

迭代器我们可以理解成一个类似于指针的东西
定义一个迭代器:

vector<typename>::iterator it;

  
 
  • 1

这样it就是vector<typename>::iterator类型的变量,typename就是定义vector时候的类型,当然it也可以写成t或者其他的样子,这里写成it是习惯,有了it这个迭代器,我们就可以通过*it来访问vector中的元素,下面我们距离来说明:
v.push_back(i);的意思是把i放入v这个vector中,下面我们会有详细的讲解
v.begin()是v的首元素地址
v.end()是取v的尾元素地址的下一个地址
在这里的begin()end()是迭代器的开始和结束标志,美国人的思维习惯左闭右开[ )

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    
    for (int i = 0; i < 10; i ++ ) v.push_back(i);
    
    vector<int>::iterator it = v.begin();
    
    for (int i = 0; i < 10; i ++ ) cout << *(it + i) << ' ';
    
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

输出结果为0 1 2 3 4 5 6 7 8 9
所以v[i]*(v.begin() + i)是等价的

利用迭代器的自增和字减去遍历元素

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    
    for (int i = 0; i < 10; i ++ ) v.push_back(i);
    //注意迭代器的遍历不能写成 it < v.end();结束循环条件只能是 it != v.end();
    for (vector<int>::iterator it = v.begin(); it != v.end(); it ++ ) 
    	cout << *it << ' ';
    
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

当然我们可以通过auto缩写

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    
    for (int i = 0; i < 10; i ++ ) v.push_back(i);
    //注意迭代器的遍历不能写成 it < v.end();结束循环条件只能是 it != v.end();
    for (auto it = v.begin(); it != v.end(); it ++ ) 
    	cout << *it << ' ';
    
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

输出结果为0 1 2 3 4 5 6 7 8 9

3.vector中的函数

(1)push_back()

v.push_back(x)就是在v的末尾添加一个元素x,时间复杂度为O(1)

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    
    for (int i = 0; i < 10; i ++ ) v.push_back(i);
    
    for (vector<int>::iterator it = v.begin(); it != v.end(); it ++ ) c
    	out << *it << ' ';
    
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16

输出结果为0 1 2 3 4 5 6 7 8 9

(2)pop_back()

v.pop_back();就是删除v的尾元素,注意是尾元素,不是任意元素,时间复杂度是O(1)

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    
    for (int i = 1; i <= 3; i ++ ) v.push_back(i);
    
    v.pop_back();
    
    for (vector<int>::iterator it = v.begin(); it != v.end(); it ++ ) 
    	cout << *it << ' ';
    
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18

输出结果为1 2

(3)size();

v.size();是用来获取v中的元素,size()返回的是unsigned类型,不过一般来说用%d不会出问题,这一点对于所有的STL容器来讲都是一样的

#include <cstdio>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    
    for (int i = 1; i <= 3; i ++ ) v.push_back(i);
    
    v.pop_back();
    
    printf("%d", v.size());
    
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

输出结果为2

(4)clear()

v.clear();用来清空vector中的所有元素,时间复杂度是O(N),N是vector中的元素数量

#include <cstdio>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    
    for (int i = 1; i <= 10; i ++ ) v.push_back(i);
    
    v.clear();
    
    printf("%d", v.size());
    
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17

输出结果为0

(5)insert()

v.insert(it, x);用来想vector任意迭代器it处插入一个元素x,时间复杂度是O(N)

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    
    for (int i = 1; i <= 5; i ++ ) v.push_back(i);
    
    for (int i = 0; i < v.size(); i ++ ) cout << v[i] << ' ';
    cout << endl;
    
    v.insert(v.begin() + 2, -1); //将-1插入v[2]的位置
    
    for (int i = 0; i < v.size(); i ++ ) cout << v[i] << ' ';
    
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

输出结果为
1 2 3 4 5
1 2 -1 3 4 5

(6)erase()

删除单个元素

v.erase(it);表示删除迭代器it处的元素

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    
    for (int i = 3; i <= 7; i ++ ) v.push_back(i);
    
    for (int i = 0; i < v.size(); i ++ ) cout << v[i] << ' ';
    cout << endl;
    //比如我们想要删除值为6这个元素,值为6这个元素对应坐标为v[3]
    v.erase(v.begin() + 3);
    
    for (int i = 0; i < v.size(); i ++ ) cout << v[i] << ' ';
    
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

输出结果为
3 4 5 6 7
3 4 5 7

删除一个区间内的元素

v.erase(first, last)即删除[first, lase)中的所有元素

#include <iostream>
#include <vector>

using namespace std;

int main()
{
    vector<int> v;
    
    for (int i = 3; i <= 7; i ++ ) v.push_back(i);
    
    for (int i = 0; i < v.size(); i ++ ) cout << v[i] << ' ';
    cout << endl;

    v.erase(v.begin() + 1, v.begin() + 4);
    //删除v[1], v[2], v[3]
    for (int i = 0; i < v.size(); i ++ ) cout << v[i] << ' ';
    
    return 0;
}

  
 
  • 1
  • 2
  • 3
  • 4
  • 5
  • 6
  • 7
  • 8
  • 9
  • 10
  • 11
  • 12
  • 13
  • 14
  • 15
  • 16
  • 17
  • 18
  • 19
  • 20

输出结果为
3 4 5 6 7
3 7

文章来源: chen-ac.blog.csdn.net,作者:辰chen,版权归原作者所有,如需转载,请联系作者。

原文链接:chen-ac.blog.csdn.net/article/details/116381073

【版权声明】本文为华为云社区用户转载文章,如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。