欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

C++ —— vector容器

程序员文章站 2022-03-22 21:19:28
...

C++知识总结目录索引

一、创建容器

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中

二、vector实现二维数组

1. 定义二维数组

  1. 利用push_back()
int main()
{
    vector<vector<int>> v;

    vector<int> a;
    a.push_back(1);
    a.push_back(2);

    vector<int> b;
    b.push_back(3);
    b.push_back(4);

    v.push_back(a);
    v.push_back(b);

    return 0;
}
  1. 直接定义一个二维数组
//定义一个5行3列的数组
int main()
{
    int i = 0;
    int j = 0;
    vector<vector<int>> array(5);
    for (i = 0; i < array.size(); i++)
        array[i].resize(3);

    return 0;
}

2. 遍历二维数组

  1. 使用迭代器
void ergodic_with_iterator(vector<vector<int>> v)
{
    if (v.empty())
        return;

    vector<vector<int>>::iterator iter;
    vector<int>::iterator it;
    vector<int> tmp;

    for (iter = v.begin(); iter != v.end(); ++iter)
    {
        tmp = *iter;
        for (it = tmp.begin(); it != tmp.end(); it++)
            cout << *it << " ";
    }
}
  1. 使用下标
void ergodic_with_index(vector<vector<int>> v)
{
    if (v.empty())
        return;

    for (int i = 0; i < v.size(); i++)
    {
        for (int j = 0; j < v[0].size(); j++)
            cout << v[i][j] << " ";
    }
}

三、重点接口介绍

1. resize()

void resize (size_type n, value_type val = value_type());

调整数组的容量,接受两个参数。
1. 如果 n < v.size(),则将其元素个数减少到n个,销毁后面那些超出的元素。
2. 如果 v.size() < n < v.capacity(),扩大size(),新增的元素值为val。
3. 如果 n > v.capacity(),对数组进行扩容,新增的元素值为val。


2. reserve()

void reserve (size_type n);
扩大数组容量,如果n > v.capacity(),给数组新开辟一块容量为n的空间,把原数据拷贝至新空间;如果n<=v.capacity(),则不进行任何操作。


3. operator[]

reference operator[] (size_type n);
const_reference operator[] (size_type n) const;

  返回数组中下标为n的元素的引用。该函数有两种形式,普通的可以通过返回值修改v[n]的值,加const不能通过返回值修改。如果n超出数组范围,直接断言报错。与它类似的还有at()函数,该函数出现越界情况是抛出异常。


4. assign()

(1) void assign(const_iterator first,const_iterator last);
(2) void assign(size_type n,const T& x = T());

(1) 将区间[first,last)的元素赋值到当前的vector容器中
(2) 赋n个值为x的元素到vector容器中,这个容器会清除掉vector容器中以前的内容。

vector<int> first;
vector<int> second;
vector<int> third;

first.assign(7, 100);             // 7 ints with a value of 100

vector<int>::iterator it;
it = first.begin() + 1;

second.assign(it, first.end() - 1); // the 5 central values of first

int myints[] = { 1776, 7, 4 };
third.assign(myints, myints + 3);   // assigning from array.

C++ —— vector容器


5. insert()

(1) iterator insert (iterator position, const value_type& val);

(2) void insert (iterator position, size_type n, const value_type& val);

(3) template <class InputIterator>
    void insert (iterator position, InputIterator first, InputIterator last);

(1) 在指定位置position前插入值为val的元素,返回指向这个元素的迭代器
(2) 在指定位置position前插入n个值为val的元素
(3)在指定位置position前插入区间[first, last)的所有元素

int main()
{
    vector<int> v1(3, 100);
    vector<int>::iterator it;

    //(1)
    it = v1.begin();
    it = v1.insert(it, 200);
    //(2)
    v1.insert(it, 2, 300);

    // "it" no longer valid, get a new one:
    it = v1.begin();

    //(3)
    vector<int> v2(2, 400);
    v1.insert(it + 2, v2.begin(), v2.end());

    int myarray[] = { 501, 502, 503 };
    v1.insert(v1.begin(), myarray, myarray + 3);

    cout << "v1 contains:";
    for (it = v1.begin(); it<v1.end(); it++)
        cout << ' ' << *it;
    cout << endl;

    return 0;
}

C++ —— vector容器


6. erase()

(1) iterator erase (iterator position);
(2) iterator erase (iterator first, iterator last);

(1) 删除position处的元素。迭代器position指向不变,仍然指向被删除元素的位置,而被删除元素之后的所有元素都向前移动一位,也就是该迭代器实际上是指向了原来被删除元素的下一个元素

(2) 删除区间[first, last)内的所有元素。删除一段段元素之后,后面的元素(从last开始到vector.end())会被复制到被删除元素段开始的地方(first开始),而vector.end()也根据删除的元素个数往前移动。

注意:即使容器内容是指针对象,erase()也会清空指针对象指向的内容。


7. clear()

  清空容器中的内容,但如果是指针对象的话,并不能清空其内容,必须要像以下方法一样才能达到清空指针对象的内容:

vector<int*> v;
for (int it = 0; it != v.size(); ++it)
{
    delete v[it];
}
v.clear();

但也可以使用swap函数巧妙的完成清理内存:

v.clear();  
v.swap(vector<int>());  

四、其他接口简介

  1. reference at(int pos);返回pos位置元素的引用
  2. reference front();返回首元素的引用
  3. reference back();返回尾元素的引用
  4. iterator begin();返回向量头指针,指向第一个元素
  5. iterator end();返回向量尾指针,指向向量最后一个元素的下一个位置
  6. reverse_iterator rbegin();反向迭代器,指向最后一个元素
  7. reverse_iterator rend();反向迭代器,指向第一个元素之前的位置
  8. bool empty() const;判断向量是否为空,若为空,则向量中无元素
  9. int size() const;返回向量中元素的个数
  10. int capacity() const;返回当前向量张红所能容纳的最大元素值
  11. int max_size() const;返回最大可允许的vector元素数量值
  12. void swap(vector&);交换两个同类型向量的数据