STL——vector容器详解

来源:互联网 发布:caxa编程平面铣 编辑:程序博客网 时间:2024/06/04 18:34

vector迭代器

对于vector<int> ivec;
正向迭代器iterator:ivec.begin(),ivec.end()
反向迭代器reverse_iterator:ivec.rbegin(),ivec.rend()//反向输出
常迭代器const_iterator:ivec.cbegin(),ivec.cend()
其余的不常用,其实一般是正向和反向迭代器

vector的初始化和交换

1.初始化
vector ivec1(2,9);//ivec1一开始为2个9
vector ivec2(ivec1);//与vector ivec=ivec1;等价,结果与ivec1一样
vector ivec3{ 1, 2, 3 };//与vector ivec3={1,2,3};等价,ivec3一开始为1,2,3,注意与ivec1的区别
vector ivec4(ivec1.begin(), ivec1.begin() + 3);//不包括ivec1.begin()+3

2.交换
swap(ivec1, ivec4);//与ivec1.swap(ivec4);等价,交换ivec1与ivec4中的值,比copy快很多

3.赋值
ivec2.assign(ivec1.begin(), ivec1.begin() + 3);
ivec2.assign({1,2,3});//将列表{1,2,3}赋给ivec2
ivec2.assign(2, 3);//赋给ivec2 2个3

4.size和capacity的区别
如果当前size为0,要初始化4个数,那么size和capacity都为4;
如果还要再插入1个数,capacity为翻倍变为8,而size只是加1变为5;
但是实际上 Visual Studio 不是这么做的,应该有优化机制,个人尝试过,VS的分配有点智能,可能是为了防止浪费空间吧。

代码:

#include <iostream> #include <vector>using namespace std; int main(){    vector<int> ivec1(2, 9);//初始化过程    ivec1.push_back(1);    ivec1.push_back(2);    ivec1.insert(ivec1.begin() + 1, 1);    vector<int> ivec2(ivec1);    vector<int> ivec3{ 1, 2, 3 };    vector<int> ivec4(ivec1.begin(), ivec1.begin() + 3);    cout << "ivec1: ";//输出    for (vector<int>::iterator iter1 = ivec1.begin(); iter1 != ivec1.end(); ++iter1){        cout << *iter1 << " ";    }    cout << endl;    cout << "ivec4: ";    for (vector<int>::iterator iter4 = ivec4.begin(); iter4 != ivec4.end(); ++iter4){        cout << *iter4 << " ";    }    cout << endl;    cout << "ivec1.size(): " << ivec1.size() << endl;//注意size和capacity的不同    cout << "ivec1.capacity(): " << ivec1.capacity() << endl;    cout << "ivec1.front(): " << ivec1.front() << endl;//ivec1的第一个元素    cout << "ivec1.back(): " << ivec1.back() << endl;//ivec1的最后一个元素    swap(ivec1, ivec4);//ivec1.swap(ivec4);交换ivec1与ivec4中的值    cout << "ivec1: ";    for (vector<int>::iterator iter1 = ivec1.begin(); iter1 != ivec1.end(); ++iter1){        cout << *iter1 << " ";    }    cout << endl;    cout << "ivec4: ";    for (vector<int>::iterator iter4 = ivec4.begin(); iter4 != ivec4.end(); ++iter4){        cout << *iter4 << " ";    }    cout << endl;    ivec2.assign(ivec1.begin(), ivec1.begin() + 3);//赋值    //ivec2.assign({1,2,3});    //ivec2.assign(2, 3);    cout << "ivec2: ";    for (vector<int>::iterator iter2 = ivec2.begin(); iter2 != ivec2.end(); ++iter2){        cout << *iter2 << " ";    }    cout << endl;    return 0;}

vector添加元素

对于vector<int> ivec;
插入方法:
ivec.push_back(t);//在尾部插入值t
ivec.insert(p,t);//在迭代器p指向的元素之前插入t值
ivec.insert(p,n,t);//在迭代器p指向的元素之前插入n个t值
ivec.insert(p,b,e);//在迭代器p指向的元素之前插入迭代器b和e指定范围内的元素,不包括e
ivec.insert(p,il);//在迭代器p指向的元素之前插入il(花括号包围的元素值列表)
注:insert的返回值是插入新元素后,返回第一个新元素的迭代器

vector访问元素

对于vector<int> ivec;
ivec.back() 返回ivec中尾元素的引用,若ivec为空,函数行为未定义
ivec.front() 返回ivec中首元素的引用,若ivec为空,函数行为未定义
ivec[n] ivec返回中下标为n的元素的引用,n是一个无符号整数。若n>=ivec.size(),则函数行为未定义
c.at(n) 返回下标为n的元素的引用。如果下标越界,则抛出一个out_of_range异常

vector删除元素

对于vector<int> ivec;
ivec.pop_back();//删除尾部元素
ivec.erase(p);//删除迭代器p所指定的元素,返回一个指向被删除元素之后元素的迭代器;若p指向尾元素,则返回尾后迭代器(off-the-end)。若p是尾后迭代器,则函数行为未定义。
ivec.erase(b,e);//删除迭代器b和e所指定范围内的元素(不包括e)。返回一个指向最后一个被删元素之后元素的迭代器,若e本身就是尾后迭代器,则函数也返回尾后迭代器。
ivec.clear();//删除ivec中所有元素。返回void

vector改变大小

vector<int> ivec(10,42);   //10个int:每个的值都是42ivec.resize(15);           //将5个值为0的元素添加到ivec末尾ivec.resize(25,-1);        //将10个值为-1的元素添加到ivec末尾ivec.resize(5);            //从ivec末尾删除20个元素

容器大小操作

  • 如果两个容器具有相同大小且所有元素都两两对应相等,则这两个容器相等;否则两个窗口不等。
  • 如果两个容器大小不同,但较小容器中每个元素都等于较大容器中的对应元素,则较小容器小于较大容器。
  • 如果两个容器都不是另一个容器的前缀子序列,则它们的比较结果取决于第一个不相等的元素的比较结果。

    例子:

    vector<int> v1 = { 1, 3, 5, 7, 9, 12 };    vector<int> v2 = { 1, 3, 9 };    vector<int> v3 = { 1, 3, 5, 7 };    vector<int> v4 = { 1, 3, 5, 7, 9, 12 };    v1 < v2;//true,v1和v2在元素[2]处不同:v1[2]小于v2[2]    v1 < v3;//false,所有元素都相等,但是v3中元素数目更少    v1 == v4;//true,每个元素都相等,且v1和v4大小相同    v1 == v2;//false,v2元素数目比v1少
0 0
原创粉丝点击