美文网首页C/C++
C++ - STL中的Vector

C++ - STL中的Vector

作者: Longshihua | 来源:发表于2019-08-11 11:36 被阅读0次

vector

向量(Vector)是一个封装了动态大小数组的顺序容器,会根据插入和删除元素自动调整容器大小。Vector中的元素是被连续存储的,所以能够进行访问和迭代。跟任意其它类型容器一样,它能够存放各种类型的对象。可以简单的认为,向量是一个能够存放任意类型的动态数组。从Vector尾部删除元素是常量时间,在Vector头部或者中间插入和删除元素是线性时间

容器特性

  • 顺序序列

顺序容器中的元素按照严格的线性顺序排序,可以通过元素在序列中的位置访问对应的元素

  • 动态数组

支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算述进行该操作。操供了在序列末尾相对快速地添加/删除元素的操作

  • 能够感知内存分配器的(Allocator-aware)

容器使用一个内存分配器对象来动态地处理它的存储需求

基本函数

  • 构造函数
vector(): 创建一个空vector
vector(int nSize): 创建一个vector,元素个数为nSize
vector(int nSize,const t& t): 创建一个vector,元素个数为nSize,且值均为t
vector(const vector&): 复制构造函数
vector(begin,end): 复制[begin,end)区间内另一个数组的元素到vector中
  • 增加函数
void push_back(const T& x): 向量尾部增加一个元素X
iterator insert(iterator it,const T& x): 向量中迭代器指向元素前增加一个元素x
iterator insert(iterator it,int n,const T& x): 向量中迭代器指向元素前增加n个相同的元素x
iterator insert(iterator it,const_iterator first,const_iterator last): 向量中迭代器指向元素前插入另一个相同类型向量的[first,last)间的数据
  • 删除函数
iterator erase(iterator it): 删除向量中迭代器指向元素
iterator erase(iterator first,iterator last): 删除向量中[first,last)中元素
void pop_back(): 删除向量中最后一个元素
void clear(): 清空向量中所有元素
  • 遍历函数
reference at(int pos): 返回pos位置元素的引用
reference front(): 返回首元素的引用
reference back(): 返回尾元素的引用
iterator begin(): 返回向量头指针,指向第一个元素
iterator end(): 返回向量尾指针,指向向量最后一个元素的下一个位置
reverse_iterator rbegin(): 反向迭代器,指向最后一个元素
reverse_iterator rend(): 反向迭代器,指向第一个元素之前的位置
  • 判断函数
bool empty() const: 判断向量是否为空,若为空,则向量中无元素
  • 大小函数
int size() const: 返回向量中元素的个数
int capacity() const: 返回当前向量所能容纳的最大元素值
int max_size() const: 返回最大可允许的vector元素数量值
void resize(int n): 缩放向量到指定大小
void resize(int n, int val): 缩放向量到指定大小并指定新元素值
void shrink_to_fit(); 减少向量的capacity来适应size大小
  • 其他函数
void swap(vector&): 交换两个同类型向量的数据
void assign(int n,const T& x): 设置向量中第n个元素的值为x
void assign(const_iterator first,const_iterator last): 向量中[first,last)中元素设置成当前向量元素

基本用法

  • 遍历vector
#include <iostream>
#include <vector>
using namespace std;

void iteratorVector() {
    vector<int> vector;

    for (int i = 1; i <= 5; i++)
        vector.push_back(i);

    cout << "output begin and end: ";
    for (auto i = vector.begin(); i != vector.end() ; ++i)
        cout << *i<<" ";

    cout <<"\noutput of cbegin and cend: ";
    for (auto i = vector.cbegin(); i != vector.cend(); ++i)
        cout << *i << " ";

    cout << "\noutput of rbegin and rend: ";
    for (auto ir = vector.rbegin(); ir != vector.rend(); ++ir)
        cout << *ir << " ";

    cout << "\noutput of crbegin and crend : ";
    for (auto ir = vector.crbegin(); ir != vector.crend(); ++ir)
        cout << *ir << " ";
}

int main(int argc, const char * argv[]) {
    iteratorVector();
    return 0;
}

运行输出

output 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
  • vector容量
void vectorCapacity() {
    vector<int> vector;

    for (int i = 1; i <= 5; i++)
        vector.push_back(i);

    cout << "size: "<< vector.size()<<endl;
    cout << "capacity: "<< vector.capacity()<<endl;
    cout << "max_size: "<< vector.max_size()<<endl;

    // resizes the vector size to 4
    vector.resize(4);

    cout <<"size: " << vector.size()<<endl;

    // checks if the vector is empty or not
    if (vector.empty()) {
        cout<<"Vector is empty"<<endl;
    } else {
        cout<<"Vector is not empty"<<endl;
    }

    // Shrinks the vector
    vector.shrink_to_fit();
    cout << "capacity: "<< vector.capacity()<<endl;
    cout << "Vector elements are: ";
    for (auto i = vector.begin(); i != vector.end(); i++)
        cout << *i <<" ";
}

运行输出

size: 5
capacity: 8
max_size: 4611686018427387903
size: 4
Vector is not empty
capacity: 4
Vector elements are: 1 2 3 4 
  • 元素访问
void accessElement() {
    vector<int> vector;

    for (int i = 1; i <= 10; i++)
        vector.push_back(i * 10);

    cout << "reference operator: "<<vector[2]<<endl;
    cout << "at: "<< vector.at(4)<<endl;
    cout << "fornt: "<< vector.front()<<endl;
    cout << "back: "<< vector.back()<<endl;
}

运行输出

reference operator: 30
at: 50
fornt: 10
back: 100
  • 插入和删除元素
void inserAndEarsetElement() {
    // 定义vector拥有3个元素,值为10
    vector<int> vec(3, 10);
    vector<int> :: iterator it;

    // 拿到迭代器
    it = vec.begin();
    // 在首元素之前插入
    it = vec.insert(it, 20);

    // 在当前it之前插入两个30
    vec.insert(it, 2, 30);

    cout <<"element is: ";
    for (it = vec.begin(); it < vec.end(); it++) {
        cout << *it << " ";
    }

    // 删除第二个元素
    vec.erase(vec.begin() + 1);

    cout <<"\nleft element is: ";
    for (it = vec.begin(); it < vec.end(); it++) {
        cout << *it << " ";
    }
}

运行输出

element is: 30 30 20 10 10 10
  • 交换和清理元素
void swapAndClearElements() {
    vector <int> vec1;
    vector <int> vec2;
    vector <int> :: iterator i;

    // 插入元素
    vec1.push_back(10);
    vec1.push_back(20);

    vec2.push_back(30);
    vec2.push_back(40);

    // 交换之前打印输出
    cout << "Before Swapping \n" << "Contents of vec1 : ";
    for (i = vec1.begin(); i != vec1.end(); ++i)
        cout << *i << '\t';

    cout << "\nContents of vec2 : ";
    for (i = vec2.begin(); i != vec2.end(); ++i)
        cout << *i << '\t';

    // 交换vector
    swap(vec1, vec2);

    // 交换之后打印输出
    cout << "\n\nAfter Swapping "<<endl;
    cout << "Contents of vec1 : ";
    for (i = vec1.begin(); i != vec1.end(); ++i)
        cout << *i << '\t';

    cout << "\nContents of vec2 : ";
    for (i = vec2.begin(); i != vec2.end(); ++i)
        cout << *i << '\t';

    // 清理并添加新元素
    cout << "\n\nNow, we clear() and then add " << "an element 1000 to vec1 : ";
    vec1.clear();
    vec1.push_back(1000);
    cout << vec1.front();
}

运行输出

Before Swapping
Contents of vec1 : 10   20  
Contents of vec2 : 30   40  

After Swapping 
Contents of vec1 : 30   40  
Contents of vec2 : 10   20  

Now, we clear() and then add an element 1000 to vec1 : 1000

参考

C++ vector 容器浅析
vector-in-cpp

相关文章

  • C++ STL 之 vectot(三)

    今天我们继续更新 C++ STL 中 vector 容器的使用 vector 容器增加元素 vector 容器增加...

  • C++ STL 之 vectot(四)

    今天我们继续更新 C++ STL 中 vector 容器的使用 vector 容器删除元素 使用 clear() ...

  • 标准模板库-vector

    标准模板库-vector 1. vector简介 vector为C++的STL中的模板数组容器。在使用时需要包含#...

  • C++ STL 之 vectot(二)

    今天我们继续更新 C++ STL 中 vector 容器的使用 vector 迭代器使用 与 array 类似,v...

  • #拖延症# 需要看的文章的记录

    C++ 对vector等STL标准容器进行排序操作--csdn该篇文章通过对vector排序的总结,明白stl是一...

  • STL总结-容器

    C++标准库(STL)中的容器 1. 序列容器 1.1. array 1.2. vector 1.3 deque...

  • STL | vector的使用(续)

    写在前面: 很久之前写过关于C++ STL中vector容器的基本用法,最近涉及到了vector容器元素的删除,发...

  • STL容器(1)-vector类

    STL vector vector是C++中的动态数组,支持动态扩容同时再末尾添加元素的时间复杂度控制在o(1) ...

  • C++ - STL中的Vector

    vector 向量(Vector)是一个封装了动态大小数组的顺序容器,会根据插入和删除元素自动调整容器大小。Vec...

  • C++ STL(2)

    C++ STL(2) from my csdn blog 顺序性容器 向量 vector动态数组,创建后会在内存中...

网友评论

    本文标题:C++ - STL中的Vector

    本文链接:https://www.haomeiwen.com/subject/tjuunqtx.html