vector容器

SyEic_L MVP++

容器简介

  • 连续
  • 动态数组(可增长)
  • 随机存取
  • 尾部添加或删除比较快,在头部或者中间比较慢
  • #include <vector>

使用

默认构造(模板类实现)

1
2
3
4
5
6
7
8
9
vector<T> vecT;    			   //T是数据类型,vecT是vector容器名  

vector<int> vecInt; //一个名叫vecInt的存放int的vector容器
vector<float> vecFloat; //一个名叫vecFloat的存放float的vector容器
vector<string> vecString; //一个名叫vecString的存放string的vector容器

class CA{};
vector<CA*> vecpCA; //用于存放CA对象指针的vector容器
vector<CA> vecCA; //用于存放CA对象的vector容器

带参数构造

  • vector(beg, end); 构造函数将[beg, end)中的元素拷贝给本身。注意区间是左闭右开。(beg -> begin)
  • vector(n, elem); 构造函数将n个elem拷贝给本身。
  • vector(const vector &vec); 构造拷贝函数。
1
2
3
4
5
6
7
8
9
10
int iArray[] = {1, 2, 3, 4, 5};

vector<int> vecA(iArray, iArray+5);
//用构造函数初始化vecB
vector<int> vecB(vecA.begin(), vecA.end());
vector<int> vecB(vecA.begin(), vecA.begin()+3);

vector<int> VecC(3, 9); //vecC存放3个元素,每个元素的值是9

vector<int> VecD(vecA); //将vecA中元素拷贝到vecD中进行构造

赋值

  • vector.assign(beg, end); 将[beg, end)中的元素拷贝给本身。注意区间是左闭右开。
  • vector.assign(n, elem); 将n个elem拷贝给本身。
  • vector & operator = (const vector &vec); 重载等号操作符。
  • vector.swap(vec); 将vec与本身的元素互换。

assign赋值时会先清空原本内容,再进行赋值。

1
2
3
4
5
6
7
8
9
10
11
vector<int> vecIntA, vecIntB, vecIntC, vecIntD;
int iArray[] = {1, 2, 3, 4, 5};

vecIntA.assign(iArray, iArray+5);
vecIntB.assign(vecIntA.begin(), vecIntA.end()); //用其他容器的迭代器做参数

vecIntC.assign(3,9);

vecIntD = vecINtA;

vecIntA.swap(vecIntD) //交换vecIntA和vecIntD内的元素

判断大小

  • vector.size(); 返回容器中元素个数。
  • vector.empty(); 判断容器是否为空。
  • vector.resize(num); 重新指定容器长度为num,变长则添加默认值,变短则删除末尾元素。
  • vector.resize(num, elem); 变长则添加elem。
1
2
3
4
5
6
7
8
9
10
11
12
int iArray[] = {1, 2, 3, 4, 5};
vecIntA.assign(iArray, iArray+5);

int iSize = vecIntA.size(); //isize == 5

bool bEmpty = vecIntA.empty(); //bEmpty == false

vecIntA.resize(7); //vecIntA中为1,2,3,4,5,0,0

vecIntA.resize(3); //vecIntA中为1,2,3

vecIntA.resize(5,100); //vecIntA中为1,2,3,100,100

访问容器中元素

  • vector.at(idx); 返回索引idx所指的数据,若下标越界,抛出out_of_range异常并终止。
  • vector[idx]; 返回索引dix所指的数据,若下标越界,不抛出异常,直接终止。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
int iArray[] = {1, 2, 3, 4, 5};
vecInt.assign(iArray, iArray+5);

vecInt.at(2) == vecInt[2]; // 3
vecInt.at(2) = 6; //或 vecInt[2] = 6;

for (int i = 0; i < vecInt.size(); i++){
cout << vecInt[i] << endl; // 1 2 6 4 5
}

int iF = vecInt.front(); //iF==1
int iB = vecInt.back(); //iB==5
vecInt.front() = 11;
vecInt.back() = 15; // 11 2 6 4 15

插入元素

  • vector.push_back(elem); 在末尾插入elem元素。

  • vector.pop_back(); 删除末尾元素。

  • vector.insert(vector.begin()+pos, elem); 在pos位置插入elem元素(也就是elem变为第pos位),第一个参数为指针。返回值为指向当前位置的有效迭代器。

  • vector.insert(vector.begin()+pos, n, elem); 在pos位置插入n个elem元素。

  • vector.insert(vector.begin()+pos, beg, end); 在pos位置插入[beg, end)中的元素,其中beg和end是指针。(可以是其他数组或vector)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
int iArray1[] = {1, 2, 3, 4, 5};
vecA.assign(iArray1, iArray1+5);
int iArray2[] = {6, 7, 8, 9, 10};
vecB.assign(iArray2, iArray2+5);

vecA.push_back(100); //1, 2, 3, 4, 5, 100
vecA.pop_vack(); //1, 2, 3, 4, 5

vecA.insert(vecA.begin()+3, 100); //1, 2, 3, 100, 4, 5
vecA.insert(vecA.begin()+3, 2, 200); //1, 2, 3, 200, 200, 100, 4, 5

vecA.assign(iArray1, iArray1+5);
vecA.insert(vecA.begin()+3, vecB.begin()+1, vevcB.end()); //1, 2, 3, 6, 7, 8, 9, 10, 4, 5
vecB.insert(vecB.begin()+3, iArray1+1, iArray1+4); //6, 7, 8, 9, 10, 2, 3, 4

嵌套

  • vector中的每个元素都是vector。
  • 表示矩阵或其他二维vector。
1
2
3
4
5
6
7
8
9
vector<vector<int>> matrix(3, vector<int>(3, 0));	//matrix为3行,每行为vector<int>(3, 0)

matrix[0][0] = 1;
matrix[1][1] = 2;
matrix[2][2] = 3;

// 1 0 0
// 0 2 0
// 0 0 3

迭代器使用

  • vector<int>::iterator iter; 变量名为iter。
  • begin() 返回容器第一个元素的正向迭代器。
  • end() 返回指向最后一个元素后一个位置的正向迭代器。

类似指针

1
2
3
4
5
6
7
8
9
10
int iArray[] = {1, 2, 3, 4, 5};
vecInt.assign(iArray, iArray+5);

vector<int>::iterator iter; //创建一个叫iter的迭代器对象
iter = vecInt.begin(); //iter指向vecInt中的第一个元素

//对iter进行for循环遍历
for (iter = vecInt.begin(); iter != vecInt.end(); iter++){
cout << *iter << endl;
}

迭代器

概念

  • 迭代器是一种检查容器内元素并且遍历容器内元素的数据类型
  • 迭代器提供对一个容器对象的访问方法,并且定义了容器中对象的范围。
  • 迭代器统一了对所有容器的访问方式。

失效

  • 插入元素后失效

    • 用insert插入后,改变了内存地址,导致失效。

    • insert()函数有返回值,返回值为指向insert位置的新的有效迭代器。

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      int main(){
      vector<int> v;
      v.push_back(1);
      v.push_back(2);
      v.push_back(3);
      v.push_back(4);

      vector<int>::iterator it = v.begin() + 3;
      v.insert(it, 6);
      cout << *it << endl; //迭代器失效
      return 0

      //it = v.insert(it, 6); it被更新为有效迭代器
      //cout << *it << endl; //输出值为6
      //return 0
      }
  • 删除元素后失效

删除元素相当于把后面的元素向前移一位,覆盖掉需要删除的元素。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
int main(){
vector<int> cond = {1, 2, 3, 3, 3, 3, 4, 5, 6};
vector<int>:: iterator it;
for (it = cond.begin(); it != cond.end(); it++){
if (*it == 3){
cond.earse(it); //it--; 可以解决问题
}
}
return 0;
}
//1, 2, 3, 3, 4, 5, 6

for (it = cond.begin(); it != cond.end(); ){
if (*it == 3){
it = cond.erase(it);
}
else{
it++;
}
}
  • Title: vector容器
  • Author: SyEic_L
  • Created at : 2025-02-19 20:42:33
  • Updated at : 2025-02-27 22:00:58
  • Link: https://blog.syeicl.vip/2025/02/19/vector容器/
  • License: This work is licensed under CC BY-NC-SA 4.0.
Comments