SiriBlog

siriyang的个人博客


  • 首页

  • 排行榜

  • 标签115

  • 分类37

  • 归档320

  • 关于

  • 搜索

STL常用模板:Vector向量

发表于 2020-01-07 更新于 2021-10-29 分类于 计算机 , 技术 , C/C++ 阅读次数: Valine:
本文字数: 5.9k 阅读时长 ≈ 5 分钟

C/C++参考文档

概念

  Vector包含着一系列连续存储的元素,其行为和数组类似。访问Vector中的任意元素或从末尾添加元素都可以在常量级时间复杂度内完成,而查找特定值的元素所处的位置或是在Vector中插入元素则是线性时间复杂度。

头文件

1
#include <vector>

名字空间

1
std

构造函数

语法:

1
2
3
4
vector();
vector( size_type num, const TYPE &val );
vector( const vector &from );
vector( input_iterator start, input_iterator end );

  C++ Vectors可以使用以下任意一种参数方式构造:

  • 无参数 - 构造一个空的vector,
  • 数量(num)和值(val) - 构造一个初始放入num个值为val的元素的Vector
  • vector(from) - 构造一个与vector from 相同的vector
  • 迭代器(start)和迭代器(end) - 构造一个初始值为[start,end)区间元素的Vector(注:半开区间).

  举例,下面这个实例构造了一个包含5个值为42的元素的Vector:

1
vector<int> v1( 5, 42 );

  构造一个100x100的,初始值为-1的二维矩阵:

1
vector<vector<int>> v2( 100,  vector<int>(100,-1));

运算符

语法:

  • v1 == v2
  • v1 != v2
  • v1 <= v2
  • v1 >= v2
  • v1 < v2
  • v1 > v2
  • v[]

  C++ Vectors能够使用标准运算符: ==, !=, <=, >=, < 和 >。 要访问vector中的某特定位置的元素可以使用 [] 操作符.

  两个vectors被认为是相等的,如果:

  1. 它们具有相同的容量
  2. 所有相同位置的元素相等

  vectors之间大小的比较是按照词典规则。


常用函数

assign

语法:

1
2
void assign( input_iterator start, input_iterator end );
void assign( size_type num, const TYPE &val );

  assign() 函数要么将区间[start, end)的元素赋到当前vector,或者赋num个值为val的元素到vector中。这个函数将会清除掉为vector赋值以前的内容。


at

语法:

1
TYPE at( size_type loc );

  at() 函数返回当前Vector指定位置loc的元素的引用。 at() 函数比 [] 运算符更加安全, 因为它不会让你去访问到Vector内越界的元素。
  例如, 考虑下面的代码:

1
2
3
4
5
vector<int> v( 5, 1 );

for( int i = 0; i < 10; i++ ) {
cout << "Element " << i << " is " << v[i] << endl;
}

  这段代码访问了vector末尾以后的元素,这将可能导致很危险的结果。以下的代码将更加安全:

1
2
3
4
5
vector<int> v( 5, 1 );

for( int i = 0; i < 10; i++ ) {
cout << "Element " << i << " is " << v.at(i) << endl;
}

  取代试图访问内存里非法值的作法,at() 函数能够辨别出访问是否越界并在越界的时候抛出一个异常。


back

语法:

1
TYPE back();

  back() 函数返回当前vector最末一个元素的引用。例如:

1
2
3
4
5
6
7
8
vector<int> v;

for( int i = 0; i < 5; i++ ) {
v.push_back(i);
}

cout << "The first element is " << v.front()
<< " and the last element is " << v.back() << endl;

  这段代码产生如下结果:

1
The first element is 0 and the last element is 4

begin

语法:

1
iterator begin();

  begin()函数返回一个指向当前vector起始元素的迭代器。例如,下面这段使用了一个迭代器来显示出vector中的所有元素:

1
2
3
4
vector<int> v1( 5, 789 );
vector<int>::iterator it;
for( it = v1.begin(); it != v1.end(); it++ )
cout << *it << endl;

capacity

语法:

1
size_type capacity();

  capacity() 函数返回当前vector在重新进行内存分配以前所能容纳的元素数量。


clear

语法:

1
void clear();

  clear()函数删除当前vector中的所有元素。


empty

语法:

1
bool empty();

  如果当前vector没有容纳任何元素,则empty()函数返回true,否则返回false。例如,以下代码清空一个vector,并按照逆序显示所有的元素:

1
2
3
4
5
6
7
8
9
10
vector<int> v;

for( int i = 0; i < 5; i++ ) {
v.push_back(i);
}

while( !v.empty() ) {
cout << v.back() << endl;
v.pop_back();
}

end

语法:

1
iterator end();

  end() 函数返回一个指向当前vector末尾元素的下一位置的迭代器。注意,如果你要访问末尾元素,需要先将此迭代器自减1。


erase

语法:

1
2
iterator erase( iterator loc );
iterator erase( iterator start, iterator end );

  erase函数要么删作指定位置loc的元素,要么删除区间[start, end)的所有元素。返回值是指向删除的最后一个元素的下一位置的迭代器。例如:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
// 创建一个vector,置入字母表的前十个字符
vector<char> alphaVector;
for( int i=0; i < 10; i++ )
alphaVector.push_back( i + 65 );
int size = alphaVector.size();

vector<char>::iterator startIterator;
vector<char>::iterator tempIterator;

for( int i=0; i < size; i++ )
{
startIterator = alphaVector.begin();
alphaVector.erase( startIterator );

// Display the vector
for( tempIterator = alphaVector.begin(); tempIterator != alphaVector.end(); tempIterator++ )
cout << *tempIterator;
cout << endl;
}

  这段代码将会显示如下输出:

1
2
3
4
5
6
7
8
9
BCDEFGHIJ
CDEFGHIJ
DEFGHIJ
EFGHIJ
FGHIJ
GHIJ
HIJ
IJ
J

front

语法:

1
TYPE front();

  front()函数返回当前vector起始元素的引用


get_allocator

语法:

1
allocator_type get_allocator();

  get_allocator() 函数返回当前vector的内存分配器。


insert

语法:

1
2
3
iterator insert( iterator loc, const TYPE &val );
void insert( iterator loc, size_type num, const TYPE &val );
void insert( iterator loc, input_iterator start, input_iterator end );

  insert() 函数有以下三种用法:

  • 在指定位置loc前插入值为val的元素,返回指向这个元素的迭代器
  • 在指定位置loc前插入num个值为val的元素
  • 在指定位置loc前插入区间[start, end)的所有元素

  举例:

1
2
3
4
5
6
7
8
9
10
11
12
//创建一个vector,置入字母表的前十个字符
vector<char> alphaVector;
for( int i=0; i < 10; i++ )
alphaVector.push_back( i + 65 );

//插入四个C到vector中
vector<char>::iterator theIterator = alphaVector.begin();
alphaVector.insert( theIterator, 4, 'C' );

//显示vector的内容
for( theIterator = alphaVector.begin(); theIterator != alphaVector.end(); theIterator++ )
cout << *theIterator;

  这段代码将显示:

1
CCCCABCDEFGHIJ

max_size

语法:

1
size_type max_size();

  max_size() 函数返回当前vector所能容纳元素数量的最大值(译注:包括可重新分配内存).


pop_back

语法:

1
void pop_back();

  pop_back()函数删除当前vector最末的一个元素,例如:

1
2
3
4
5
6
7
8
9
10
11
12
vector<char> alphaVector;
for( int i=0; i < 10; i++ )
alphaVector.push_back( i + 65 );

int size = alphaVector.size();
vector<char>::iterator theIterator;
for( int i=0; i < size; i++ ) {
alphaVector.pop_back();
for( theIterator = alphaVector.begin(); theIterator != alphaVector.end(); theIterator++ )
cout << *theIterator;
cout << endl;
}

  这段代码将显示以下输出:

1
2
3
4
5
6
7
8
9
ABCDEFGHI
ABCDEFGH
ABCDEFG
ABCDEF
ABCDE
ABCD
ABC
AB
A

push_back

语法:

1
void push_back( const TYPE &val );

  push_back()添加值为val的元素到当前vector末尾


rbegin

语法:

1
reverse_iterator rbegin();

  rbegin函数返回指向当前vector末尾的逆迭代器。(译注:实际指向末尾的下一位置,而其内容为末尾元素的值,详见逆代器相关内容)


rend

语法:

1
reverse_iterator rend();

  rend()函数返回指向当前vector起始位置的逆迭代器.


reserve

语法:

1
void reserve( size_type size );

  reserve()函数为当前vector预留至少共容纳size个元素的空间。(译注:实际空间可能大于size)


resize

语法:

1
void resize( size_type size, TYPE val );

  resize() 函数改变当前vector的大小为size,且对新创建的元素赋值val


size

语法:

1
size_type size();

  size() 函数返回当前vector所容纳元素的数目


swap

语法:

1
void swap( vector &from );

  swap()函数交换当前vector与vector from的元素

-------- 本文结束 感谢阅读 --------
相关文章
  • STL常用模板:MultiSet多元集合
  • STL常用模板:MultiMap多元字典
  • STL常用模板:Map字典
  • STL常用模板:Bitset位集合
  • STL常用模板:Double Ended Queue双向队列
觉得文章写的不错的话,请我喝瓶怡宝吧!😀
SiriYang 微信支付

微信支付

SiriYang 支付宝

支付宝

  • 本文标题: STL常用模板:Vector向量
  • 本文作者: SiriYang
  • 创建时间: 2020年01月07日 - 20时01分
  • 修改时间: 2021年10月29日 - 18时10分
  • 本文链接: https://blog.siriyang.cn/posts/20200107203328id.html
  • 版权声明: 本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
C/C++ 文档 STL
STL常用模板:Iterator迭代器
STL常用模板:Stack栈
  • 文章目录
  • 站点概览
SiriYang

SiriYang

努力搬砖攒钱买镜头的摄影迷
320 日志
33 分类
88 标签
RSS
GitHub E-Mail
Creative Commons
Links
  • 友情链接
  • 作品商铺

  1. 概念
  2. 构造函数
  3. 运算符
  4. 常用函数
    1. assign
    2. at
    3. back
    4. begin
    5. capacity
    6. clear
    7. empty
    8. end
    9. erase
    10. front
    11. get_allocator
    12. insert
    13. max_size
    14. pop_back
    15. push_back
    16. rbegin
    17. rend
    18. reserve
    19. resize
    20. size
    21. swap
蜀ICP备19008337号 © 2019 – 2025 SiriYang | 1.7m | 25:41
0%