一、定义vector模板
vector<type>name(num) //num表示定义的初始长度 type表示类型
是一个容器,必须引入头文件 #include<vector>
vector是一个顺序容器,它的内存地址是连续的。
二、迭代器
什么是迭代器?它是一个广义指针,事实上,他可以是指针,也可以是一个对其执行类似指针的操作——如解引用(*)如)(operator*())和递增(如operatolr++())——的对象,通过将指针广义化为迭代器,让STL能够成为各种不同的容器类统一的接口。每个容器类都定义了合适的迭代器,该迭代器的类型是一个名为iterator的typedef。
迭代器定义如下:
需要头文件#<include>iterator
vector<double>::itearator pd; //定义一个daouble类型的vector容器迭代器pd
例子:
vector<double>::iterator pd;
vector<double>scores={1,2,3};
pd = scores.begin(); //将scores容器的第一个元素的地址赋予迭代器
while(pd!=score.begin)
{
cout << *pd << endl; //打印容器里的元素
pd++; //循环地址增加指向下一个地址
}
迭代器的种类:
迭代器种类 | 简要 |
iterator | 前向遍历 可读可写(从前往后遍历) |
const_iterator | 前向遍历,只读 |
reverse_iterator | 后向遍历,可读可写(从后往前遍历) |
const_reverse_iterator | 后向遍历,只读 |
关于begin end成员函数下面后有详细介绍 ↓↓↓
三、vector容器的常用操作函数(还有所有容器公用的函数)
1.size()
返回vector容器中所有元素个数(长度)。
2.swap()
用于将两个相同类型的容器元素进行交换
例:
vector<int>v1 = {1,2,3};
vector<int>v2 = {4,5,6,7,9};
v1.swap(v2); //交换必须是两个类型相同的vector容器才能交换
for(int i = 0;i<v1.size();i++)
{
cout << v1[i] <<" "; // v1 = {4,5,6,7,9}
}
cout << endl;
for(int i = 0;i<v2.size();i++)
{
cout << v2[i] <<" "; //v2 = {1,2,3};
}
cout << endl;
3.begin()和end()
返回一个指向容器中第一个元素的迭代器和返回一个指向容器中最后一个元素 + 1(表示超过容器尾的)位置的迭代器
不知道end具体指向哪里的请看图:
例:
vector<int>l1 = {1,2,3,4,5,6,7,8,9,10};
vector<int>::iterator pt;
pt = l1.begin()
for(;pt!=l1.end();pt++)
{
cout << *pt << " & "; //打印l1中的元素
}
4.push_back()
表示从数组最后一个元素后面添加一个元素。
例:
vector<int>l1 = {1,2,3,4,5,6,7,8,9,10};
l1.push_back(60); //结果 l1 = {1,2,3,4,5,6,7,8,9,10,60};
5.erase()
删除给定的容器的区间,这里它接收两个迭代器参数(这些参数定义了区间),第一个迭代器执行区间的起始处,第二个迭代位于区间中指出的后一个位置
例:
vector<int> pl= {1,2,3,4,5};
pl.erase(pl.begin()+1,pl.begin()+3); //pl = {1,4,5}'
6.insert()
接受三个迭代器参数,第一个是指定新元素插入的位置,第二个和第三个迭代器参数定义了被插入区间,该区间通常是另一个容器对象的一部分
例如 将下面矢量new_v中除了第一个元素外的所有元素插入到old_v矢量的第一个元素前面:
vector<int>old_v = {1,2,3};
vector<int>new_v = {4,5,6};
old_v.insert(old_v.begin(),new_v.begin()+1,new_v.end());
//old_v = {1,5,6,3};
7.for_each() 注:需要引入头文件<algorithm>
可以用于多种容器类,接受三个参数,前两个是定义容器中区间的迭代器,最后是一个指向函数的指针(更普遍的说最后一个是一个函数对象),for_each函数将被指向的函数应用于容器区间中的各个元素,被指向的函数不能修改容器元素的值。完全可以用for_each()函数来代替循环
例:
#include<vector>
#include<algorithm>
#include<iostream>
using std::cout;
using std::endl;
void Show(int & p)
{
cout << p << endl;
}
int main ()
{
vector<int> mm(5) = {11,22,33,44,55};
for_each(mm.begin(),mm.end(),Show);
/*
最后打印出 11,22,33,44,55
*/
return 0;
}
如果学过JS的话有一个forEach接受一个回调函数差不多的
8.random_shuffle() 注:需要引入头文件<algorithm>
接受两个指定区间的迭代器参数,并随机排列该区间中的元素;
9.sort() 注:需要引入头文件<algorithm>
该函数也要要求容器支持随机访问。这个函数公有两个版本。
第一个:
接受两个定义区间的迭代器参数,并使用为存储在容器中的类型元素定义的<运算符对区间中的元素进行操作。
例:
vector<int>po = {55,33,198,36,884};
sort(po.begin(),po.end()); //结果 {33,36,55,198,884};
第二个:
接受两个定义区间的迭代器参数,并且还接受一个用户自定义的函数。
例如:
bool compear(int a, int b)
{
if (a > b)
{
return true; //a在b的后面
}
return false;
}
int main ()
{
vector<double>d1 = { 60.0,5.69,66.9,48.4,0.58,9.5 };
sort(d1.begin(), d1.end(), compear); //比较容器中的元素大小,前两个是比较区间,最后一个参数是一个函数指针,传入一个自定义函数,可以自定义排序
}
四、基于范围的for循环(C++11)
例如:
double prices[5] = {44.0,10.99,6.87,7.89,8.49};
for(double x: prices)
{
cout << x << std::endl;
}
这种for循环中,括号内的代码声明一个类型与容器存储的内容相同的变量,然后指出了容器的名称。然后循环体使用指定变量一次访问容器的每个元素。
for_each(books.begin(),books.end(),Show);
可以将其替换为下面基于范围的for循环:
for(auto x : books) Show(x);
也可以用引用参数来修改容器内容:
for(auto & x : books) Show(x);