C++中的向量

时间:2020-02-23 14:30:09  来源:igfitidea点击:

C++中的Vector是类似数组的容器,可以动态改变大小。
作为C++ STL的一部分,Vector可以支持各种动态数组操作。

C++中的向量概述

向量类似于数组,存储在连续的内存位置中。
这意味着访问时间非常快。

向量使用动态分配的数组,这意味着一旦达到极限,就必须重新分配向量。

这种重新分配操作有点昂贵,这是Vector的一个缺点。

下图显示了发生Vector重新分配的场景。

在将第三个元素添加到现在为空的位置之前,现在将容量为2的原始矢量( <1,2>)动态调整为容量4。

向量重新分配

用C++创建向量

要使用此容器,我们必须首先包含头文件" vector"。

#include <vector>

我们现在可以使用创建一个新的向量:

std::vector<type> a;

其中" <类型>"可以引用任何数据类型,例如" int"," float"," char"等。

我们还可以在初始化期间直接分配元素。

#include <vector>

using namespace std;

vector<int> a = {1, 2, 3, 4};

这将创建一个整数向量,初始化为 <1、2、3、4>。
所以第一个元素是1,最后一个元素是4。

现在我们有了向量,让我们看一下涉及它的一些向量操作。

C++中的向量运算

我们可以在向量容器上使用多种方法,其中一些是:

迭代器方法

  • begin()->将迭代器返回到开头
  • end()->将迭代器返回到末尾
  • rbegin()->将反向迭代器返回到反向开始
  • rend()->将反向迭代器返回到反向端点

这是显示上述方法的示例。
我们不能使用cout直接打印向量,而必须在for循环中访问向量的元素。

迭代器可用于此目的。

#include <iostream>
#include <vector>

using namespace std;

int main() {
  vector<int> a = {1, 2, 3, 4};
  for (auto it = a.begin(); it != a.end(); it++)
      cout << *it << " ";
  return 0;
}

输出

1 2 3 4 

同样,我们可以使用rbegin()rend()反向打印矢量。

#include <iostream>
#include <vector>

using namespace std;

int main() {
  vector<int> a = {1, 2, 3, 4};
  for (auto it = a.rbegin(); it != a.rend(); it++)
      cout << *it << " ";
  return 0;
}

输出

4 3 2 1 

容量方法

  • size()->返回大小
  • max_size()->返回可以分配的最大大小
  • resize(SIZE)->将向量调整为SIZE元素
  • Capacity()->返回分配的内存容量的大小
  • empty()->检查向量是否为空
#include <iostream>
#include <vector>

using namespace std;

int main() {
  vector<int> a = {1, 2, 3, 4, 5, 6};

  for (auto it = a.begin(); it != a.end(); it++)
      cout << *it << " ";
  cout << endl;
  
  cout << "Is the vector empty? " << (a.empty() ? "Yes" : "No") << endl;
  cout << "Size: " << a.size() << endl;
  cout << "Capacity: " << a.capacity() << endl;
  cout << "Maximum Size: " << a.max_size() << endl;

  //Let's resize the vector to 4
  a.resize(4);
  
  cout << "Vector after resize(): \n";

  for (auto it = a.begin(); it != a.end(); it++)
      cout << *it << " ";
  
  cout << endl;

  return 0;
}

输出

1 2 3 4 5 6 
Is the vector empty? No
Size: 6
Capacity: 6
Maximum Size: 2305843009213693951
Vector after resize(): 
1 2 3 4 

元素访问方法

  • 使用[]运算符。
    与数组相同。

  • at(INDEX)->访问位置INDEX处的元素

  • front()->访问第一个元素

  • back()->访问最后一个元素

#include <iostream>
#include <vector>

using namespace std;

int main() {
  vector<int> a = {1, 2, 3, 4, 5, 6};

  cout << "Access using []:\n";
  for (unsigned int i=0; i<a.size(); i++)
      cout << a[i] << " ";
  cout << endl;

  cout << "Access using at():\n";
  for (unsigned int i=0; i<a.size(); i++)
      cout << a.at(i) << " ";
  cout << endl;

  cout << "First Element: " << a.front() << endl;
  cout << "Last Element: " << a.back() << endl;

  return 0;
}

输出

Access using []:
1 2 3 4 5 6 
Access using at():
1 2 3 4 5 6 
First Element: 1
Last Element: 6

修饰符方法

  • push_back()->在最后添加元素
  • pop_back()->删除最后一个元素
  • clear()->清除内容
#include <iostream>
#include <vector>

using namespace std;

int main() {
  vector<int> a = {1, 2, 3, 4, 5, 6};

  a.push_back(7);
  a.push_back(8);

  cout << "vector after push_back():\n";
  for(unsigned int i=0; i<a.size(); i++)
      cout << a[i] << " ";
  cout << endl;
  

  a.pop_back();

  cout << "vector after pop_back():\n";
  for(unsigned int i=0; i<a.size(); i++)
      cout << a[i] << " ";

  return 0;
}

如您所见,我们在向量上执行了一些推入和弹出操作,以动态更改大小。
这显示了向量的动态性质。

vector after push_back():
1 2 3 4 5 6 7 8 
vector after pop_back():
1 2 3 4 5 6 7