STL-vector的使用 详细说明

vector

vector是一个动态数组,是基本数组的类模板,内部定义了很多接口。
现在我创建一个vector对象
首先需要包头文件:

#include "Vector"
std::list<int> v1;

例如这个例子,我实例化出了一个对象。

接下来我参考cpulscpuls.com,介绍接口的用法:

一.数据操作:

1.assign:

    ①:void assign (size_type n, const value_type& val);

    ②:template <class InputIterator>
       void assign (InputIterator first, InputIterator last);

①:

    std::vector<int> first;
    first.assign(7, 100);

则此时first里就会有7个100。

②:

    std::vector<int> first;
    std::vector<int> second;
    first.assign(7, 100);//first里有7个100
    std::vector<int>::iterator it = first.begin() + 1;//迭代器it指在first的第二个100
    second.assign(it, first.end() - 1); //区间是it到first的最后一个(左闭右开)

则此时second里有5个100。
这里写图片描述

    std::vector<int> third;
    int myints[] = { 1776, 7, 4 };//数组里存1776 7 4
    third.assign(myints, myints + 3);那么现在third里就会存这三个数

2.push_back:尾插

void push_back (const value_type& val);

void push_back (const value_type& val);
    std::vector<int> first;
    first.push_back(1);
    first.push_back(2);
    first.push_back(3);
    first.push_back(4);

那么通过尾插,现在first里就会有1 2 3 4四个数据。

3.pop_back:尾删

void pop_back();

比较容易,就是直接删除尾上的数据。

4.insert:


①: iterator insert (iterator position, const value_type& val);  
②: void insert (iterator position, size_type n, const value_type& val); 
③: template <class InputIterator>
    void insert (iterator position, InputIterator first, InputIterator last);

①:

`   std::vector<int> myvector(3, 100);//myvector里有3个100
    std::vector<int>::iterator it = myvector.begin();//迭代器it等于第一个数据
    it = myvector.insert(it, 200);`//在it前插入200并返回迭代器

现在myvector里存的是200 100 100 100
②:

    myvector.insert(it, 2, 300);//在it前插入2个300,可以指定数量

那么现在myvector里就有300 300 200 100 100 100
③:

    it = myvector.begin();//300 300 200 100 100 100

    std::vector<int> anothervector(2, 400);//anothervector里存了2个400
    myvector.insert(it + 2, anothervector.begin(), anothervector.end());
    //从it+2开始存指定的区间(以anothervector的begin开始,到end结束的区间)

那么myvector现在存了300 300 400 400 200 100 100 100
这里写图片描述

5.erase:注意,删完数据返回下一个

①:iterator erase (iterator position);
②:iterator erase (iterator first, iterator last);

①:

    std::vector<int> myvector;
    for (int i = 1; i <= 10; i++)
    {
        myvector.push_back(i);
    }//此时myvector里存有 1 2 3 4 5 6 7 8 9 10
    myvector.erase(myvector.begin() + 5);//删除第六个

此时myvector里存有 1 2 3 4 5 7 8 9 10(6已经删除)
②:

    myvector.erase(myvector.begin(), myvector.begin() + 3);
    //删除了从myvector的begin开始到begin+3的区间

此时myvector里存有4 5 7 8 9 10。
6.swap:交换

void swap (vector& x);
    std::vector<int> v1(5, 10)//;10 10 10 10 10
    std::vector<int> v2(6,6);//6 6 6 6 6 6
    v1.swap(v2);

交换完后,v1: 6 6 6 6 6 6
v2:10 10 10 10 10
7.clear:

void clear();
    std::vector<int> v1(5, 10);//10 10 10 10 10
    v1.clear();

清空后,v1里不存数据。

二:迭代器:

1.begin和end:返回迭代器的开始,结束

首先我需要介绍一下迭代器,先来看用法:

    std::vector<int> v1(5,10);//10 10 10 10 10
    std::vector<int>::iterator it = v1.begin();//it现在指向了第一个数据10

所谓迭代器,它就是一个类,可以理解它为指针,可以进行解引用,->,++,–,等操作,比如上面的例子,可以理解为it指向了v1的第一个数据,可以让代码更灵活。

iterator begin();
const_iterator begin() const;

iterator end();
const_iterator end() const;
    std::vector<int> myvector;
    for (int i = 1; i <= 5; i++)
    {
        myvector.push_back(i);
    }//此时myvector里存有1 2 3 4 5

    //迭代器it从开始一直到结束
    for (std::vector<int>::iterator it = myvector.begin(); it != myvector.end(); ++it)
    {
        std::cout << ' ' << *it;
    }
    std::cout << endl;

输出1 2 3 4 5

2.rbegin和rend:返回反向迭代器的开始,结束
所谓反向迭代器,只是和普通迭代器的方向不同。

reverse_iterator rbegin();
const_reverse_iterator rbegin() const;

reverse_iterator rend();
const_reverse_iterator rend() const;
    std::vector<int> myvector(5);//0 0 0 0 0
    int i = 0;

    std::vector<int>::reverse_iterator rit = myvector.rbegin();//反向迭代器,等于myvector的rbegin(也就是end)
    for (; rit != myvector.rend(); ++rit)
    {
        *rit = ++i;//那么会从最后依次赋值分别为5 4 3 2 1
    }

可以看到,begin/end,rbegin/rend都分别有一个重载的const成员函数,this指针被const修饰,表示指向的内容是常量,所以当const对象调用begin/end,rbegin/rend这些函数时,会调到重载的const成员函数,返回的也是const迭代器。

三:容量

1.size:

size_type size() const;//const成员函数
    std::vector<int> myints;
    std::cout << "0. size: " << myints.size() << endl;//此时myints无数据,调用size()

    for (int i = 0; i < 5; i++)
    {
        myints.push_back(i);
    }
    std::cout << "1. size: " << myints.size() << endl;//1 2 3 4 5再次调用size()

输出:0. size: 0
1. size: 5

2.max_size:

size_type max_size() const
    std::vector<char> myvector0;
    std::cout << "max_size: " << myvector0.max_size() << endl;

    std::vector<int> myvector;
    std::cout << "max_size: " << myvector.max_size() << endl;

    std::vector<double> myvector1;
    std::cout << "max_size: " << myvector1.max_size() << endl;

不同类型创建的对象分别调用max_size,分别输出为:
char: 4294967295
int: 1073741823
double: 536870911
max_size返回的是整形最大值4294967295除以类型的大小。
3.resize:
resize是改变size的函数,并且还具有初始化的能力:

void resize (size_type n, value_type val = value_type());
    std::vector<int> myvector;

    for (int i = 1; i<10; i++) myvector.push_back(i);//1 2 3 4 5 6 7 8 9

    myvector.resize(5);//1 2 3 4 5
    myvector.resize(8, 100);//1 2 3 4 5 100 100 100
    myvector.resize(12);//1 2 3 4 5 100 100 100 0 0 0 0
.当n<size,直接删除后面的数据
.当n>size,多出来的值会初始化:
    (1):当写死了类型的值val,那么就会补val
    (2):若没有写,那么就调用该类型默认构造函数补。

4.capacity:返回容量

size_type capacity() const
    std::vector<int> myvector;
    for (int i = 0; i < 100; i++)
    {
        myvector.push_back(i);//此时插入了100个数据,size应该是100
    }
    std::cout << "capacity: " << (int)myvector.capacity() << '\n';

输出:capacity: 141

5.empty:判断是否为空,为空返回1,不为空返回0

bool empty() const;
    std::vector<int> myvector;
    cout << myvector.empty() << endl;//输出1
    myvector.push_back(1);
    cout << myvector.empty() << endl;//输出0

6.reserve:改变容量

void reserve (size_type n);
    std::vector<int> myvector;
    cout << myvector.capacity() << endl;//0
    myvector.reserve(100);//将容量变为100
    cout << myvector.capacity() << endl;//100

四:元素访问

1.operator[]:返回指向vector容器中n位置的元素的引用。

reference operator[] (size_type n);

const_reference operator[] (size_type n) const;//重载
    std::vector<int> myvector(10); //0 0 0 0 0 0 0 0 0 0
    std::vector<int>::size_type sz = myvector.size();//sz == 10;
    for (unsigned i = 0; i<sz; i++)
    {
        myvector[i] = i;//依次取
    }

那么现在myvector里存有0 1 2 3 4 5 6 7 8 9
2.at:返回位置n中的元素的引用。

reference at (size_type n);
const_reference at (size_type n) const;
    std::vector<int> myvector(10);//10个0
    for (unsigned i = 0; i < myvector.size(); i++)
    {
        myvector.at(i) = i;//依次赋值

    }

此时:myvector里存有0 1 2 3 4 5 6 7 8 9
3.front和back:
front:对vector容器中第一个元素的引用。如果vector对象是const,函数返回一个const_reference。否则,它返回一个引用
back:对向量中最后一个元素的引用。如果vector对象是const,函数返回一个const_reference。否则,它返回一个引用。

reference front();
const_reference front() const;

reference back();
const_reference back() const;
    std::vector<int> myvector;
    myvector.push_back(78);
    myvector.push_back(16);//78 16
    std::cout << "myvector.front() is now " << myvector.front() << '\n';//此时front()是78
    std::cout << "myvector.back()  is now " << myvector.front() << '\n';//此时back()是16

    myvector.front() -= myvector.back();
    std::cout << "myvector.front() is now " << myvector.front() << '\n';

输出:
myvector.front() is now 78
myvector.back() is now 16
myvector.front() is now 62

猜你喜欢

转载自blog.csdn.net/han8040laixin/article/details/78750863