c++vector容器

#define _CRT_SECURE_NO_WARNINGS

#include <iostream>

#include <vector>//vector翻译为向量,意思为动态数组,可变数组

using namespace std;

//vector容器为单口容器,类似于栈

//vector动态增长的基本原理:

//当插入新元素时,如果空间不足,那么vector会重新申请更大的一块内存空间,将原空间的数据拷贝到新空间,释放旧空间的数据,再把新元素插入新申请的空间

int main()

{

vector<int> v4;//默认构造

int arr1[] = { 3,5,7,9,1,4,8 };

//通过起始位置和最后一个元素的再后一个位置进行复制区间初始化

vector<int> v5(arr1, arr1 + sizeof(arr1) / sizeof(int));

vector<int> v6(v5.begin(), v5.end());//其实也是复制区间初始化

vector<int> v7(v5);//拷贝构造

vector<int>::iterator it1 = v5.begin();//v5的起始迭代器

while (it1 != v5.end())

{

//迭代器取*和指针意义一样,即为取指向位置的元素

cout << *it1 << endl;

it1++;

}

//vector常用的赋值操作

vector<int> v8;

//使用assign方法给v8赋值

v8.assign(v5.begin(), v5.end());

vector<int> v9;

v9 = v5;

int arr2[] = { 100, 200, 300 };

vector<int> v10(arr2, arr2 + sizeof(arr2) / sizeof(int));

//容器v10与容器v5元素进行交换

//两个数组只要元素类型相同,元素个数不相同仍是可以交换的,因为这是使他们对象中的指针指向的空间相互交换,并不是把指向空间的内容修改

v10.swap(v5);

vector<int>::iterator it2 = v10.begin();

it1 = v5.begin();

while (it1 != v5.end())//遍历容器v5

{

cout << *it1 << " ";

it1++;

}

cout << endl;

while (it2 != v10.end())

{

cout << *it2 << " ";

it2++;

}

cout << endl;

//大小操作

cout << "size:" << v5.size() << endl;//返回容器中元素个数,这儿v5元素由于和v10交换了,因此只有三个

if (v5.empty())//判断容器是否为空

{

cout << "为空" << endl;

}

else

{

cout << "不为空" << endl;

}

v5.resize(2);//变小时,强制把元素末尾的数据扔掉,只留前面的元素

v5.resize(5);//变大时,默认帮我们在容器后面加0

v5.resize(6, 1);//两个参数时,增大的空间用1去填充

it1 = v5.begin();

while (it1 != v5.end())

{

cout << *it1 << " ";

it1++;

}

cout << endl;

cout << v5.capacity() << endl;//容器容量,不是指已拥有的元素,而是指容器本身可以包含多少个元素,与v5.size()是两种概念

//存取数据

v5[3] = 400;//程序直接挂掉

v5.at(4) = 500;//抛异常

it1 = v5.begin();

while (it1 != v5.end())

{

cout << *it1 << " ";

it1++;

}

cout << endl;

cout << "front:" << v5.front() << endl;//返回容器第一个元素

cout << "back:" << v5.back() << endl;//返回容器最后一个元素

//插入和删除

vector<int> v11;

v11.push_back(10);

v11.push_back(20);

v11.insert(v11.begin(), 30);//头插法

v11.insert(v11.begin() + 2, 100);//vector支持随机访问,即可以任意访问容器的任意位置,insert函数第一个参数的位置,即为插入元素所在的位置,不是指从这个位置起,向后插入,而是这个位置即变为插入的元素,这个位置原本的元素向后推移

v11.insert(v11.end(), 40);//尾插法

v11.pop_back();//从元素末尾删除一个元素

v11.erase(v11.begin());//删除第一个元素,这时第二个元素变为容器的第一个元素了,这是因为v11.begin()指针指向了后一个元素,本质上这个区域的内存大小是不减少的

v11.erase(v11.begin(), v11.begin() + 1);

v11.clear();

cout << "size:" << v11.size() << endl;

//vector添加元素时,它会自动扩大内存,删除元素时,并不会自动减少内存

//巧用swap函数收缩vector空间

vector<int> v12;

for (int i = 0; i < 1000; i++)

{

v12.push_back(i);

}

cout << "size:" << v12.size() << endl;

cout << "capacity:" << v12.capacity() << endl;

v12.resize(10);

cout << "size:" << v12.size() << endl;

cout << "capacity:" << v12.capacity() << endl;

//下面一段代码十分巧妙的收缩了容器的空间,执行的步骤是先以v12为模板拷贝构造一个匿名对象,这个对象只有v12.size()的空间,并不是capacity的空间,再与v12进行内部指针交换指向空间,此时v12指向此匿名对象的空间,而这段代码执行完以后,匿名对象编会被系统回收,只留有容器v12,十分巧妙的收缩了容器的容量

vector<int>(v12).swap(v12);

cout << "size:" << v12.size() << endl;

cout << "capacity:" << v12.capacity() << endl;

//预留空间

v11.resize(100);//只是指已有元素的个数,与size对应

v11.reserve(1000);//这是为系统为容器指定内存空间时,一次性为容器分配多少空间,与capacity有关

//总结:当你知道容器大概要存储的元素个数时,你可以用reserve来指定系统一次为容器预留的空间

return 0;

}

猜你喜欢

转载自blog.csdn.net/tulipless/article/details/81135296