3.3.2vector容器
vector的数据安排及操作方式,与array非常相似,两者唯一差别在于空间的运用的灵活性。Array是静态控件,一旦配置了就不能改变,要换大一点或者小一点的空间,可以,一切琐碎得由自己来,首先配置一块新的空间,然后将旧空间的数据办网新空间,在释放原来的空间。Vector时动态空间,随着元素的加入,他的内部机制就会自动阔充空间以容纳新元素。因此vector的运用对于内存的合理利用与运用的灵活性有很大的帮助,我们再也不必害怕空间不足而一开始就要求一个大块头的array了。
//vector容器遍历
void test14() {//1.构造一个vector对象 通过vector无参构造,构造空vector容器vector<int> v;//2.添加若干个元素v.push_back(10);v.push_back(20);v.push_back(30);//3.迭代器:使用普通指针 一次指向vector中每一个元素//begin():获取到的是vector容器中的首元素的地址//end():获取到的是vector容器中的最后一位元素的下一位的指针/*vector<int>::iterator it = v.begin();cout << *it << endl;it++;cout << *it << endl;it++;cout << *it << endl;*/for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {//直接输出指针指向元素//cout << *it << endl;//可以通过指针,修改元素if (*it == 20) {*it = 200;}}//使用迭代器遍历vector容器for (vector<int>::iterator it = v.begin(); it != v.end(); it++) {cout << *it << endl;}//使用迭代器遍历容器的时候可以缩写//一次将vector容器的每一个元素,给element赋值for (int ele : v) {if (ele == 200) {ele = 2000;}}for (int ele : v) {cout << ele << endl;}for (int& ele : v) {if (ele == 200) {ele = 2000;}}for (int ele : v) {cout << ele << endl;}int a = 10;int& b = a;//想通过b修改a加&b = 100;
}int main() {test14();system("pause");return 0;//倒序遍历vectorfor (vector<int>::iterator it = v.end(); it != v.begin(); ) {it--;cout << *it << endl;}
}
vector构造函数
vector<T> v;//采用模板实现类实现,默认构造函数
vector(v.begin(), v.end());//将v[begin(), end())区间中的元素拷贝给本身
vector(n, elem);//构造函数将n个elem拷贝给本身
vector(const vector &vec);//拷贝构造函数。//例子 使用第二个构造函数我们可以...
int arr[] = {2,3,4,1,9};
vector<int> v1(arr, arr + sizeof(arr)/sizeof(int));
//vector的构造函数
void test15() {//1.无参构造vector<int> v1 = vector<int>();//同vector<int> v1;//2.vector(n, ele)// 使用n个ele填充容器vector<int> v2(10, 5);printVector(v2);//3.vector(const vector& v).拷贝构造函数//4.vector(v.begin(),v.end())宝座不包右vector<int> v3(v2.begin(), v2.begin() + 5);printVector(v3);int array[] = { 1,2,3,4,5 };vector<int> v4(array, array + 3);printVector(v4);}
vector的常用赋值
assign(beg, end);//将[beg,end)区间中的数据拷贝赋值给本身
assign(n, elem);//将n个elem拷贝赋值给本身
vector& operator=(const vector &vec);//重载等号操作符
swap(vec);//将vec与本身的元素互换
//vector的赋值函数
void test16() {//assign(beg, end);//将[beg,end)区间中的数据拷贝赋值给本身//assign(n, elem);//将n个elem拷贝赋值给本身//vector& operator=(const vector& vec);//重载等号操作符//swap(vec);//将vec与本身的元素互换int arr[] = { 1,2,3,4,5,6,7,8,9,0 };//vector对象的构建vector<int> v1;v1.assign(arr, arr + 6);printVector(v1);//1,2,3,4,5,6,vector<int> v2;v2.assign(5, 10);printVector(v2);//10,10,10,10,10,vector<int> v3;v3 = v2;printVector(v3);//10,10,10,10,10,v1.swap(v2);printVector(v1);//10,10,10,10,10,printVector(v2);//1,2,3,4,5,6,
}
vector的大小操作
size();//返回容器中的元素的个数
empty();//判断容器是否为空
resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。
capacity();//容器的容量
reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问
//vector的大小操作
void test17() {//size();//返回容器中的元素的个数//empty();//判断容器是否为空//resize(int num);//重新指定容器的长度为num,若容器变长,则以默认值填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。//resize(int num, elem);//重新指定容器的长度为num,若容器变长,则以elem填充新位置。如果容器变短,则末尾超出容器长度的元素被删除。//capacity();//容器的容量//reserve(int len);//容器预留len个元素长度,预留位置不初始化,元素不可访问vector<int> v(10, 5);//返回容器中由多少个元素cout << "size = " << v.size() << endl;//判断容器是否为空cout << "empty = " << v.empty() << endl;//返回容器的容量cout << "capacity =" << v.capacity() << endl;//重新指定容器的长度,如果新的长度小于原来的长度,保留容器中的前指定数量的元素,后面的元素不可见v.resize(5);cout << "size = " << v.size() << endl;//如果新长度大于原来的长度,在后面填充默认元素v.resize(15);cout << "size = " << v.size() << endl;printVector(v);//后面填充指定元素v.resize(20, 9);
}
vector的数据存取操作
at(int idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。
operator[];//返回索引idx所指的数据,越界时,运行直接报错
front();//返回容器中第一个数据元素
back();//返回容器中最后一个数据元素
//vector的数据存取操作
void test18() {//at(int idx);//返回索引idx所指的数据,如果idx越界,抛出out_of_range异常。//operator[];//返回索引idx所指的数据,越界时,运行直接报错//front();//返回容器中第一个数据元素//back();//返回容器中最后一个数据元素int array[] = { 1,2,3,4,5,6,7,8,9,10 };vector<int> v(array, array + (sizeof(array) / sizeof(int)));//int& ele = v.at(3);cout << ele << endl;ele = 40;printVector(v);//int& e = v[5];cout << e << endl;e = 60;printVector(v);cout << v.front() << endl;cout << v.back() << endl;
}
vector插入和删除操作
insert(const_iterator pos, int count, ele);//迭代器指向位置pos插入count个 元素ele
push_back(ele);//尾部插入元素ele
pop_back();//删除最后一个元素
erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素
erase(const_iterator pos);//删除迭代器指向的元素
clear();//删除容器中所有元素
//数据插入删除
void test19() {//insert(const_iterator pos, int count, ele);//迭代器指向位置pos插入count个 元素ele//push_back(ele);//尾部插入元素ele//pop_back();//删除最后一个元素//erase(const_iterator start, const_iterator end);//删除迭代器从start到end之间的元素//erase(const_iterator pos);//删除迭代器指向的元素//clear();//删除容器中所有元素//通过数组构建vectorint array[] = { 1,2,3,4,5,6,7,8,9,10 };vector<int> v(array, array + (sizeof(array) / sizeof(int)));//需求:希望在第3位插入元素 v.insert(v.begin() + 3, 5, 0);//在第3位插入5个0printVector(v);//1,2,3,0,0,0,0,0,4,5,6,7,8,9,10,v.push_back(20);//在末尾插入20printVector(v);//1,2,3,0,0,0,0,0,4,5,6,7,8,9,10,20,
}
利用swap函数实现vector容器收缩内存空间
//vector小案例:利用swap收缩空间
void test20() {//capacity:在内存上开辟了多少个空间//size:实际容器中存放的元素的数量//capacity>=sizevector<int> v;for (int i = 0; i < 10000; i++) {v.push_back(i);}cout << "size = " << v.size() << endl;//10000cout << "capacity = " << v.capacity() << endl;//12138//使用resize更改容器的元素数量v.resize(10);cout << "size = " << v.size() << endl;//10cout << "capacity = " << v.capacity() << endl;//12138vector<int>(v).swap(v);cout << "size = " << v.size() << endl;//10 cout << "capacity = " << v.capacity() << endl;//10#if 0{vector<int> v2(v);cout << "v2 size =" << v2.size() << endl;//10cout << "v2 capacity =" << v2.capacity() << endl;//10v2.swap(v);cout << "size = " << v.size() << endl;//10cout << "capacity = " << v.capacity() << endl;//10cout << "v2 size =" << v2.size() << endl;//10cout << "v2 capacity =" << v2.capacity() << endl;//12138}//放代码段里 v2用完直接释放 瘦身效果
#endif
}