C++ —— vector容器

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.

这里写图片描述


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;
}

这里写图片描述


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&);交换两个同类型向量的数据

猜你喜欢

转载自blog.csdn.net/Tianzez/article/details/80557316