STL中的容器:
vector容器的常用接口及用法:
vector:STL
中最常用的容器,和数组结构非常类似,也被称作单端数组;
vector
容器和普通数组的区别:不同之处在于,数组是静态空间(一旦给定了初始长度,无法修改),而 vector
容器可以动态扩展;
动态扩展:并不是在原有空间的后面续接新空间,而是找到在内存中一块更大的空间,先将原数据拷贝到新空间,后释放原空间;
图片转自于黑马程序员,是在学习的过程中截图下来的
各种函数接口具体如何使用,下面的代码块中会有详细的使用方法
vector
容器构造函数:
1.vector<T> v;
默认(无参)构造函数;
2.vector(const vector & v);
拷贝构造函数
3.vector(begin(),end());
把区间 [begin(),end())
的数据拷贝给当前的 vector
容器;
4.vector(n,elem);
将n个 elem
拷贝给当前的 vector
容器;
#include <iostream>
#include <vector> //使用STL中的容器,得包含它的头文件
#include <algorithm> //使用STL提供的算法,得包含它的头文件
using namespace std;
void printVector(vector<int> & v) //输出打印vector容器内部的值
{
for(vector<int>::iterator it = v.begin();it!=v.end();it++)
{
cout << *it << " ";
}
cout << endl;
}
void test_1() //vector容器构造函数
{
int i = 0;
vector<int> v1; //默认(无参)构造函数,创建了一个int类型的vector容器
for(i=0;i<10;i++)
{
v1.push_back(i+1); //尾插法把数据插入到v1中
}
printVector(v1);
vector<int> v2(v1); //拷贝构造函数,把v1中的数据拷贝到vector容器v2中
printVector(v2);
vector<int> v3(v2.begin(),v2.end()); //通过区间([v2.begin(),v2.end()))的方式创建vector容器
printVector(v3);
vector<int> v4(10,1); //把10个1传入新创建的vector容器v4中
printVector(v4);
}
int main()
{
test_1();
system("pause");
return 0;
}
vector
容器赋值操作:
1.vector& operator=(const vector & v);
通过重载赋值运算符的方式把 vector
容器 v
的数据赋值到当前的容器 vector
;
2.vector& assign(begin,end);
把区间 [begin,end)
的数据赋值给当前的容器 vector
;
3.vector& assign(n,elem);
把n个elem赋值给当前的容器 vector
;
#include <iostream>
#include <vector> //使用STL中的容器,得包含它的头文件
#include <algorithm> //使用STL提供的算法,得包含它的头文件
using namespace std;
void printVector(vector<int> & v) //输出打印vector容器内部的值
{
for(vector<int>::iterator it = v.begin();it!=v.end();it++)
{
cout << *it << " ";
}
cout << endl;
}
void test_1() //vector容器赋值
{
int i = 0;
vector<int> v1; //先创建一个容器vector
for(i=0;i<10;i++)
{
v1.push_back(i+1); //尾插法把数据插入到v1中
}
printVector(v1);
vector<int> v2;
v2 = v1; //通过重载赋值运算符的方式把vector容器v的数据赋值到当前的容器vector v2
printVector(v2);
vector<int> v3;
v3.assign(v1.begin(),v1.end()); //把区间[begin,end)的数据赋值给当前的容器vector v3
printVector(v3);
vector<int> v4;
v4.assign(10,1); //把10个1赋值给当前的容器vector v4
printVector(v4);
}
int main()
{
test_1();
system("pause");
return 0;
}
vector
容器的容量和大小(元素个数):
1.empty();
判断 vector
容器是否为空,如果 vector
容器为空,则返回 true
,否则返回 false
;
2.capacity();
用于查看容器的容量;
3.size()
用于查看容器的大小(元素个数);(容量 >= 元素个数)
4.resize(int num);
重新指定容器的大小为 num
,若容器扩大了,则以默认值(0)来填充,若容器变小了,则删除多出来的部分;
5.resize(int num,int elem);
重新指定容器的大小为 num
,若容器扩大了,则以 elem
来填充多出来的部分,若容器变小了,则删除多出来的部分;
#include <iostream>
#include <vector> //使用STL中的容器,得包含它的头文件
#include <algorithm> //使用STL提供的算法,得包含它的头文件
using namespace std;
void printVector(vector<int> & v) //输出打印vector容器内部的值
{
for(vector<int>::iterator it = v.begin();it!=v.end();it++)
{
cout << *it << " ";
}
cout << endl;
}
void test_1() //vector容器容量和大小
{
int i = 0;
vector<int> v1; //先创建一个容器vector
for(i=0;i<10;i++)
{
v1.push_back(i+1); //尾插法把数据插入到v1中
}
printVector(v1);
if(v1.empty()) //判断容器是否为空,若容器为空,则返回true,否则返回false
{
cout << "当前容器为空" << endl;
}
else
{
cout << "当前容器不为空" << endl;
cout << "当前容器的容量为:" << v1.capacity() << endl; //用于查看容器的容量
cout << "当前容器的大小为:" << v1.size() << endl; //用于查看容器的大小
}
cout << "——————————————————————————————————————" << endl;
v1.resize(20); //重新指定容器的大小为20,容器扩大,以默认值(0)来填充
printVector(v1);
cout << "当前容器的容量为:" << v1.capacity() << endl; //用于查看容器的容量
cout << "当前容器的大小为:" << v1.size() << endl; //用于查看容器的大小
cout << "——————————————————————————————————————" << endl;
v1.resize(25,10); //重新指定容器的大小为25,容器扩大,以10来填充多出来的部分
printVector(v1);
cout << "当前容器的容量为:" << v1.capacity() << endl; //用于查看容器的容量
cout << "当前容器的大小为:" << v1.size() << endl; //用于查看容器的大小
cout << "——————————————————————————————————————" << endl;
v1.resize(5); //重新指定容器的大小为5,容器缩小,删除多出来的部分
printVector(v1);
cout << "当前容器的容量为:" << v1.capacity() << endl; //用于查看容器的容量
cout << "当前容器的大小为:" << v1.size() << endl; //用于查看容器的大小
}
int main()
{
test_1();
system("pause");
return 0;
}
vector
容器插入和删除:
1.push_back(ele);
从 vector
容器尾部插入 ele
元素;
2.pop_back();
删除掉 vector
容器中的最后一个元素;
3.insert(const_iterator pos,ele);
通过迭代器给 vector
容器指定位置插入元素 ele
;
4.insert(const_iterator pos,int count,ele);
通过迭代器给 vector
容器指定位置插入 count
个 ele
元素;
5.erase(const_iterator pos);
通过迭代器把 vector
容器中指定位置的元素删除;
6.erase(const_iterator start,const_iterator end);
通过迭代器把 vector
容器中 start
到 end
的之间元素删除;
7.clear();
删除 vector
容器中的所有元素;
#include <iostream>
#include <vector> //使用STL中的容器,得包含它的头文件
#include <algorithm> //使用STL提供的算法,得包含它的头文件
using namespace std;
void printVector(vector<int> & v) //输出打印vector容器内部的值
{
for(vector<int>::iterator it = v.begin();it!=v.end();it++)
{
cout << *it << " ";
}
cout << endl;
}
void test_1() //vector容器插入和删除
{
int i = 0;
vector<int> v1; //先创建一个容器vector
//通过尾插法向vector容器中插入数据
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
printVector(v1);
v1.pop_back(); //通过尾删法删除掉vector容器中的最后一个数据
printVector(v1);
v1.insert(v1.begin(),100); //通过迭代器给vector容器头部插入100
printVector(v1);
v1.insert(v1.begin(),2,1000); //通过迭代器给vector容器指定位置插入2个1000
printVector(v1);
v1.erase(v1.begin()); //通过迭代器把vector容器中头部的元素删除
printVector(v1);
v1.erase(v1.begin(),v1.end()); //通过迭代器把vector容器中begin到end的之间元素删除
printVector(v1);
v1.clear(); //清空当前vector容器的所有元素
printVector(v1);
}
int main()
{
test_1();
system("pause");
return 0;
}
vector
容器数据存取:
1.operator[];
通过重载 []
的方式,获取 vector
容器的每一个元素;
2.at(int idx);
通过成员函数 at()
获取 vector
容器的每一个元素;
3.front();
返回容器中的第一个元素;
4.back();
返回容器中的最后一个元素;
#include <iostream>
#include <vector> //使用STL中的容器,得包含它的头文件
#include <algorithm> //使用STL提供的算法,得包含它的头文件
using namespace std;
void test_1() //vector容器数据存取
{
int i = 0;
vector<int> v1;
v1.push_back(10);
v1.push_back(20);
v1.push_back(30);
v1.push_back(40);
v1.push_back(50);
for(i=0;i<5;i++)
{
cout << v1[i] << " "; //通过重载[]的方式,获取vector容器的每一个元素
}
cout << endl;
for(i=0;i<5;i++)
{
cout << v1.at(i) << " "; //通过成员函数at(),获取vector容器的每一个元素
}
cout << endl;
cout << "第一个元素为:" << v1.front() << endl; //返回容器中的第一个元素
cout << "最后一个元素为:" << v1.back() << endl; //返回容器中的最后一个元素
}
int main()
{
test_1();
system("pause");
return 0;
}
vector
容器互换:实现两个容器的交换;
1.swap(vec);
将容器 vec
与本身的 vector
容器进行交换;
#include <iostream>
#include <vector> //使用STL中的容器,得包含它的头文件
#include <algorithm> //使用STL提供的算法,得包含它的头文件
using namespace std;
void printVector(vector<int> & v) //输出打印vector容器内部的值
{
for(vector<int>::iterator it = v.begin();it!=v.end();it++)
{
cout << *it << " ";
}
cout << endl;
}
void test_1() //交换vector容器
{
int i = 0;
vector<int> v1;
for(i=0;i<10;i++)
{
v1.push_back(i+1);
}
vector<int> v2;
for(i=10;i>0;i--)
{
v2.push_back(i);
}
cout << "交换前:" << endl;
printVector(v1);
printVector(v2);
v1.swap(v2); //交换容器v1和容器v2
cout << "交换后:" << endl;
printVector(v1);
printVector(v2);
}
//容器互换的实际用途:巧用swap()收缩内存
void test_2()
{
int i = 0;
vector<int> v1;
for(i=0;i<100000;i++) //这里开辟了一个很大的vector容器
{
v1.push_back(i+1);
}
cout << "v1的容量为:" << v1.capacity() << endl; //此时v1的容量很大,因为v1的大小(元素个数)很大,且容量>=大小
cout << "v1的大小为:" << v1.size() << endl;
v1.resize(5);
cout << "v1的容量为:" << v1.capacity() << endl; //此时v1的容量仍然很大,只是重置了v1的大小,但v1的容量并没有改变,导致大部分空间被浪费
cout << "v1的大小为:" << v1.size() << endl;
//这一行要分两部分来理解,前面的部分是 vector<int> (v1),这里相当于创建了一个匿名对象,通过拷贝构造的方式进行初始化
//后面的部分是 .swap(v1),将匿名对象与原来的v1交换,因此v1的容量就变小了,而匿名对象执行完这行后就由系统释放掉,所以成功实 现了收缩内存
vector<int> (v1).swap(v1);
cout << "v1的容量为:" << v1.capacity() << endl; //此时v1的容量仍然很大,只是重置了v1的大小,但v1的容量并没有改变,导致大部分空间被浪费
cout << "v1的大小为:" << v1.size() << endl;
}
int main()
{
//test_1();
test_2();
system("pause");
return 0;
}
vector
容器预留空间:减少 vector
容器在动态扩展时的次数;
1.reserve(int len);
vector
容器预留 len
个元素长度,预留位置不进行初始化,且不可访问;
#include <iostream>
#include <vector> //使用STL中的容器,得包含它的头文件
#include <algorithm> //使用STL提供的算法,得包含它的头文件
using namespace std;
void test_1() //vector容器预留空间
{
int i = 0;
int *p = NULL;
int num = 0; //用于统计动态扩展的次数
vector<int> v1;
v1.reserve(100000); //先给v1预留100000的空间
for(i=0;i<100000;i++)
{
v1.push_back(i+1);
if(p!=&v1[0]) //若发生动态扩展,每一次都会找一个新的更大的内存空间来存放vector容器,因此地址改变一次,就说明进行了一次动态扩展
{
p = &v1[0];
num++;
}
}
cout << "动态扩展的次数为:" << num << endl;
}
int main()
{
test_1();
system("pause");
return 0;
}
以上就是STL中vector容器的一些常用接口和用法啦O(∩_∩)O。笔记中有错误的地方,欢迎指出,欢迎大家讨论!