vector容器概念

功能:

  • vector数据结构和数组非常相似,也称为单端数组

vector与普通数组区别:

  • 不同之处在于数组是静态空间,而vector可以动态扩展

动态扩展:

  • 并不是在原空间之后续接新空间,而是找更大的内存空间,然后将原数据拷贝新空间,释放原空间
  • vector容器的选代器是支持随机访问的选代器

vector构造函数

  1. vector v;//采用模板实现类实现,默认构造函数
  2. vector(v.begin(), v.end());//将v[begin(),end())区间中的元素拷贝给本身。
  3. vector(n,elem);//构造函数将n个elem拷贝给本身。
  4. vector(const vector &vec);//拷贝构造函数。

    #include<iostream>
    using namespace std;
    #include<vector>
    void print_vector(vector<int>& v)
    {
     for (auto it = v.begin(); it < v.end(); it++)
     {
         cout << *it << " ";
     }
     cout << endl;
    }
    void test()
    {
     vector<int>v1;
     for (int i = 0; i < 10; i++)
     {
         v1.push_back(i);
     }
     print_vector(v1);
     vector<int>v2(v1.begin(), v1.end());
     print_vector(v2);
     vector<int>v3(10, 100);
     print_vector(v3);
     vector<int>v4(v3);
     print_vector(v4);
    }
    int main()
    {
     test();
    }

vector赋值操作

vector& operator=(const vector &vec);//重载等号操作符
assign(beg, end);//将[beg,end)区间中的数据拷贝赋值给本身。
assign(n, elem);//将n个elem拷贝赋值给本身。

#include<iostream>
using namespace std;
#include<vector>
void print_vector(vector<int>& v)
{
    for (auto it = v.begin(); it < v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
void test()
{
    vector<int>v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    print_vector(v1);
    vector<int>v2;
    v2 = v1;
    print_vector(v2);
    vector<int>v3;
    v3.assign(v1.begin(), v1.end());
    print_vector(v3);
    vector<int>v4;
    v4.assign(10, 100);
    print_vector(v4);
}

int main()
{
    test();
}

vector容器大小

  1. empty();/判断容器是否为空//容器的容量//返回容器中元素的个数
  2. capacity();//容器的容量
  3. size();//返回容器中元素的个数
  4. resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
  5. resize(int num,elem);//重新指定容器的长度为num,若容器变长,则以elem值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除
#include<iostream>
using namespace std;
#include<vector>
void print_vector(vector<int>& v)
{
    for (auto it = v.begin(); it < v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
void test()
{
    vector<int>v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    print_vector(v1);
    if (v1.empty())
    {
        cout << "容器为空" << endl;
    }
    else {
        cout << "容器不为空" << endl;
        cout << "容量:" << v1.capacity() << endl;
        cout << "大小:" << v1.size() << endl;
    }
    v1.resize(15);
    print_vector(v1);
    v1.resize(20, 100);
    print_vector(v1);
    v1.resize(5);
    print_vector(v1);
}

int main()
{
    test();
}

vector插入和删除

  1. push_back(ele);//尾部插入元素ele
  2. pop_back();//删除最后一个元素
  3. insert(const_iterator pos, ele);//迭代器指向位置pos插入元素ele
  4. insert(const_iterator pos,int count,ele);//迭代器指向位置pos插入count个元素ele
  5. erase(const_iterator pos); //删除选代器指向的元素
  6. erase(const_iterator start,const_iterator end);//删除迭代器从start到end之间的元素
  7. clear();//删除容器中所有元素
#include<iostream>
using namespace std;
#include<vector>
void print_vector(vector<int>& v)
{
    for (auto it = v.begin(); it < v.end(); it++)
    {
        cout << *it << " ";
    }
    cout << endl;
}
void test()
{
    vector<int>v1;
    //尾部插入元素
    v1.push_back(10);
    v1.push_back(20);
    v1.push_back(30);
    v1.push_back(40);
    v1.push_back(50);
    print_vector(v1);
    //尾部删除元素
    v1.pop_back();
    v1.pop_back();
    print_vector(v1);
    //插入元素
    v1.insert(v1.begin(), 100);
    print_vector(v1);
    v1.insert(v1.begin(), 2, 50);
    print_vector(v1);
    //删除元素
    v1.erase(v1.begin() + 2);
    print_vector(v1);
    //清空
    v1.erase(v1.begin(), v1.end());
    v1.clear();#include<iostream>
using namespace std;
#include<vector>
void test()
{
    vector<int>v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    for (int i = 0; i < v1.size(); i++)
    {
        cout << v1[i] << " ";
    }
    cout << endl;
    for (int i = 0; i < v1.size(); i++)
    {
        cout << v1.at(i) << " ";
    }
    cout << endl;
    cout << "v1的第一个元素" << v1.front() << endl;
    cout << "v1的最后一个元素" << v1.back() << endl;
}
int main()
{
    test();
}
    print_vector(v1);
}
int main()
{
    test();
}

vector数据存取

  1. at(int idx);//返回索引idx所指的数据
  2. operator[];//返回索引idx所指的数据
  3. front();//返回容器中第一个数据元素
  4. back();//返回容器中最后一个数据元素
#include<iostream>
using namespace std;
#include<vector>
void test()
{
    vector<int>v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    for (int i = 0; i < v1.size(); i++)
    {
        cout << v1[i] << " ";
    }
    cout << endl;
    for (int i = 0; i < v1.size(); i++)
    {
        cout << v1.at(i) << " ";
    }
    cout << endl;
    cout << "v1的第一个元素" << v1.front() << endl;
    cout << "v1的最后一个元素" << v1.back() << endl;
}
int main()
{
    test();
}

vector互换容器

实现两个容器内元素进行互换
swap(vec);//将vec与本身的元素互换
实际的用途是可以收缩内存

#include<iostream>
using namespace std;
#include<vector>
void print_vector(vector<int>& v)
{
    for (int i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;
}
void test()
{
    vector<int>v1;
    for (int i = 0; i < 10; i++)
    {
        v1.push_back(i);
    }
    cout << "v1和v2交换前" << endl;
    print_vector(v1);
    vector<int>v2;
    for (int i = 10; i > 0; i--)
    {
        v2.push_back(i);
    }
    print_vector(v2);
    v1.swap(v2);
    cout << "v1和v2交换后" << endl;
    print_vector(v1);
    print_vector(v2);
}
//实际用途,巧用swap收缩内存空间
void func()
{
    vector<int>v;
    for (int i = 0; i < 100000; i++)
    {
        v.push_back(i);
    }
    cout << "v的容量为:" << v.capacity() << endl;
    cout << "v的大小为" << v.size() << endl;
    v.resize(3);//重新指定大小
    cout << "v的容量为:" << v.capacity() << endl;
    cout << "v的大小为" << v.size() << endl;
    vector<int>(v).swap(v);//收缩内存,创建一个匿名对象,把v的值拷贝过来,然后交换,匿名对象下一行会自动销毁。
    cout << "v的容量为:" << v.capacity() << endl;
    cout << "v的大小为" << v.size() << endl;
}
int main()
{
    //test();
    func();
}

vector容器预留空间

减少vector在动态扩展容量时的扩展次数
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问。

#include<iostream>
using namespace std;
#include<vector>
void print_vector(vector<int>& v)
{
    for (int i = 0; i < v.size(); i++)
    {
        cout << v[i] << " ";
    }
    cout << endl;
}
void test1()
{
    vector<int>v;
    int num = 0;
    int* p = NULL;
    for (int i = 0; i < 100000; i++)
    {
        v.push_back(i);
        if (p != &v[0])
        {
            p = &v[0];
            num++;
        }
    }
    cout << num << endl;
}
void test2()
{
    vector<int>v;
    v.reserve(100000);
    int num = 0;
    int* p = NULL;
    for (int i = 0; i < 100000; i++)
    {
        v.push_back(i);
        if (p != &v[0])
        {
            p = &v[0];
            num++;
        }
    }
    cout << num << endl;
}
int main()
{
    test1();
    test2();
}

如果我们事先确定要用很多元素,就可以使用reserve,可以提高一定的效率。