📜  C++ STL中的向量

📅  最后修改于: 2021-05-30 10:45:30             🧑  作者: Mango

向量与动态数组相同,具有在插入或删除元素时自动调整自身大小的能力,并且容器自动处理其存储。向量元素放置在连续的存储中,以便可以使用迭代器对其进行访问和遍历。在向量中,数据将插入到末尾。在末尾插入会花费不同的时间,因为有时可能需要扩展阵列。删除最后一个元素只需要固定的时间,因为不会发生大小调整。在开始或中间插入和擦除的时间是线性的。

与向量关联的某些功能是:
迭代器

  1. begin()–返回指向向量中第一个元素的迭代器
  2. end()–返回一个迭代器,该迭代器指向向量中最后一个元素之后的理论元素
  3. rbegin()–返回指向向量中最后一个元素的反向迭代器(反向开始)。它从最后一个元素移动到第一个元素
  4. rend()–返回一个反向迭代器,该迭代器指向向量中第一个元素之前的理论元素(视为反向端点)
  5. cbegin()–返回指向向量中第一个元素的常量迭代器。
  6. cend()–返回一个常量迭代器,该迭代器指向向量中最后一个元素之后的理论元素。
  7. crbegin()–返回一个常量反向迭代器,该迭代器指向向量中的最后一个元素(反向开始)。它从最后一个元素移动到第一个元素
  8. crend()–返回一个常量反向迭代器,该迭代器指向向量中第一个元素之前的理论元素(视为反向端点)
// C++ program to illustrate the
// iterators in vector
#include 
#include 
  
using namespace std;
  
int main()
{
    vector g1;
  
    for (int i = 1; i <= 5; i++)
        g1.push_back(i);
  
    cout << "Output of begin and end: ";
    for (auto i = g1.begin(); i != g1.end(); ++i)
        cout << *i << " ";
  
    cout << "\nOutput of cbegin and cend: ";
    for (auto i = g1.cbegin(); i != g1.cend(); ++i)
        cout << *i << " ";
  
    cout << "\nOutput of rbegin and rend: ";
    for (auto ir = g1.rbegin(); ir != g1.rend(); ++ir)
        cout << *ir << " ";
  
    cout << "\nOutput of crbegin and crend : ";
    for (auto ir = g1.crbegin(); ir != g1.crend(); ++ir)
        cout << *ir << " ";
  
    return 0;
}
输出:
Output of begin and end: 1 2 3 4 5 
Output of cbegin and cend: 1 2 3 4 5 
Output of rbegin and rend: 5 4 3 2 1 
Output of crbegin and crend : 5 4 3 2 1

容量

  1. size()–返回向量中元素的数量。
  2. max_size()–返回向量可以容纳的最大元素数。
  3. Capacity()–返回当前分配给向量的存储空间的大小,以元素数表示。
  4. resize(n)–调整容器的大小,使其包含’n’个元素。
  5. empty()–返回容器是否为空。
  6. rinke_to_fit()–减小容器的容量以适应其大小,并破坏超出该容量的所有元素。
  7. reserve()–请求向量容量至少足以包含n个元素。
// C++ program to illustrate the
// capacity function in vector
#include 
#include 
  
using namespace std;
  
int main()
{
    vector g1;
  
    for (int i = 1; i <= 5; i++)
        g1.push_back(i);
  
    cout << "Size : " << g1.size();
    cout << "\nCapacity : " << g1.capacity();
    cout << "\nMax_Size : " << g1.max_size();
  
    // resizes the vector size to 4
    g1.resize(4);
  
    // prints the vector size after resize()
    cout << "\nSize : " << g1.size();
  
    // checks if the vector is empty or not
    if (g1.empty() == false)
        cout << "\nVector is not empty";
    else
        cout << "\nVector is empty";
  
    // Shrinks the vector
    g1.shrink_to_fit();
    cout << "\nVector elements are: ";
    for (auto it = g1.begin(); it != g1.end(); it++)
        cout << *it << " ";
  
    return 0;
}
输出:
Size : 5
Capacity : 8
Max_Size : 4611686018427387903
Size : 4
Vector is not empty
Vector elements are: 1 2 3 4

元素访问:

  1. 引用运算符[g] –返回对向量中位置“ g”的元素的引用
  2. at(g)–返回对向量中位置“ g”的元素的引用
  3. front()–返回对向量中第一个元素的引用
  4. back()–返回对向量中最后一个元素的引用
  5. data()–返回指向指针的直接指针,该指针由向量在内部用于存储其拥有的元素。
// C++ program to illustrate the
// element accesser in vector
#include 
using namespace std;
  
int main()
{
    vector g1;
  
    for (int i = 1; i <= 10; i++)
        g1.push_back(i * 10);
  
    cout << "\nReference operator [g] : g1[2] = " << g1[2];
  
    cout << "\nat : g1.at(4) = " << g1.at(4);
  
    cout << "\nfront() : g1.front() = " << g1.front();
  
    cout << "\nback() : g1.back() = " << g1.back();
  
    // pointer to the first element
    int* pos = g1.data();
  
    cout << "\nThe first element is " << *pos;
    return 0;
}
输出:
Reference operator [g] : g1[2] = 30
at : g1.at(4) = 50
front() : g1.front() = 10
back() : g1.back() = 100
The first element is 10

修饰符:

  1. Assign()–通过替换旧元素将新值分配给矢量元素
  2. push_back()–将元素从背面推入向量
  3. pop_back()–用于从背面弹出或弹出矢量中的元素。
  4. insert()–在指定位置的元素之前插入新元素
  5. delete()–用于从指定位置或指定范围从容器中删除元素。
  6. swap()–用于将一个向量的内容与另一个相同类型的向量交换。大小可能会有所不同。
  7. clear()–用于删除向量容器的所有元素
  8. emplace()–通过在位置插入新元素来扩展容器
  9. emplace_back()–用于将一个新元素插入向量容器,该新元素被添加到向量的末尾

// C++ program to illustrate the
// Modifiers in vector
#include 
#include 
using namespace std;
  
int main()
{
    // Assign vector
    vector v;
  
    // fill the array with 10 five times
    v.assign(5, 10);
  
    cout << "The vector elements are: ";
    for (int i = 0; i < v.size(); i++)
        cout << v[i] << " ";
  
    // inserts 15 to the last position
    v.push_back(15);
    int n = v.size();
    cout << "\nThe last element is: " << v[n - 1];
  
    // removes last element
    v.pop_back();
  
    // prints the vector
    cout << "\nThe vector elements are: ";
    for (int i = 0; i < v.size(); i++)
        cout << v[i] << " ";
  
    // inserts 5 at the beginning
    v.insert(v.begin(), 5);
  
    cout << "\nThe first element is: " << v[0];
  
    // removes the first element
    v.erase(v.begin());
  
    cout << "\nThe first element is: " << v[0];
  
    // inserts at the beginning
    v.emplace(v.begin(), 5);
    cout << "\nThe first element is: " << v[0];
  
    // Inserts 20 at the end
    v.emplace_back(20);
    n = v.size();
    cout << "\nThe last element is: " << v[n - 1];
  
    // erases the vector
    v.clear();
    cout << "\nVector size after erase(): " << v.size();
  
    // two vector to perform swap
    vector v1, v2;
    v1.push_back(1);
    v1.push_back(2);
    v2.push_back(3);
    v2.push_back(4);
  
    cout << "\n\nVector 1: ";
    for (int i = 0; i < v1.size(); i++)
        cout << v1[i] << " ";
  
    cout << "\nVector 2: ";
    for (int i = 0; i < v2.size(); i++)
        cout << v2[i] << " ";
  
    // Swaps v1 and v2
    v1.swap(v2);
  
    cout << "\nAfter Swap \nVector 1: ";
    for (int i = 0; i < v1.size(); i++)
        cout << v1[i] << " ";
  
    cout << "\nVector 2: ";
    for (int i = 0; i < v2.size(); i++)
        cout << v2[i] << " ";
}
输出:
The vector elements are: 10 10 10 10 10 
The last element is: 15
The vector elements are: 10 10 10 10 10 
The first element is: 5
The first element is: 10
The first element is: 5
The last element is: 20
Vector size after erase(): 0

Vector 1: 1 2 
Vector 2: 3 4 
After Swap 
Vector 1: 3 4 
Vector 2: 1 2

所有向量函数:

  • vector :: begin()和vector :: end()
  • 向量rbegin()和rend()
  • vector :: cbegin()和vector :: cend()
  • vector :: crend()和vector :: crbegin()
  • 向量:: assign()
  • 向量:: at()
  • 向量:: back()
  • 向量::: capacity()
  • 向量:: clear()
  • 向量:: push_back()
  • 向量::: pop_back()
  • 向量::: empty()
  • 向量::: erase()
  • 向量::: size()
  • 矢量:: swap()
  • 向量::: reserve()
  • 向量::: resize()
  • 向量::: shrink_to_fit()
  • 向量::运算符=
  • vector ::运算符[]
  • 矢量::: front()
  • 向量::: data()
  • 矢量:: emplace_back()
  • 矢量:: emplace()
  • 向量::: max_size()
  • 向量:: insert()
要从最佳影片策划和实践问题去学习,检查了C++基础课程为基础,以先进的C++和C++ STL课程基础加上STL。要完成从学习语言到DS Algo等的更多准备工作,请参阅“完整面试准备课程”