vector容器的使用
vector
位于头文件<vector>
,是C++
提供的一种顺序存储的容器,能通过位置索引高效的访问容器中的任意元素,可以看做是一个长度能动态变化的数组。
vector
类是一个模板类,使用时需要指定模板参数。注意:作为模板参数的类型要有无参数的构造函数(如果不使用Allocator
)。
它常用的构造函数如下:
int main()
{
vector<string> v; //无参数版
vector<string> v2(10); //初始容量为10的vector,每个元素为都为string的默认值
vector<string> v3(10,"abc"); //初始容量为10,且每一个元素都为 abc
}
如果要访问或者修改vector
的内容可以用如下的函数:
vector<int> v;
v.push_back(10); //将一个元素添加到容器的末尾
v.push_back(20);
cout << v[0] << endl; //访问索引为0的元素,即 10
v.erase(v.begin() + 1); //删除索引为1的元素,begin()函数的含义见下一节
v.insert(v.begin() + 1,30); //在索引为1的元素之前插入一个元素
v.clear(); //删除所有元素
同时,vector
还有如下的成员函数用于查询元素数量:
int size = v.size(); //返回元素数量
bool isem = v.empty(); //容器为空则返回true
vector
的成员函数不仅仅只有这些,感兴趣的同学可以查阅其他资料进行学习。
容器的迭代器
STL
中的容器都提供了 迭代器iterator
成员类型,它就像一个指针,使用它能按照一种 特定的顺序 遍历容器中的所有元素。
一般来说,当你对一个迭代器it
进行it++
自增操作时,就能进入到下一个元素,进行it--
自减操作时,就能回到上一个元素。有些迭代器还支持it+=2
,it-=2
这样跨多个元素的操作。而对它使用*it
取值操作,就能获得当前的元素值。
上一节的begin()
函数,返回的其实就是一个指向第一个元素的迭代器,与之对应的还有一个end()
函数,它返回一个指向最后一个元素之后不存在的元素的迭代器,有了这两个函数,我们就能访问vector
中的所有元素了:
vector<int> v(5,10); //容量为5,元素值都是10
for(vector<int>::iterator it = v.begin();it != v.end();it++)
cout << *it << " ";
得到的结果是:
10 10 10 10 10
此时我们也可以知道,vector
的erase
,insert
函数的参数实际上都是迭代器类型。
注意:在使用迭代器迭代一个容器的过程中,使用修改容器内容的函数可能会使得迭代器无效,因此尽量不要在这个过程中修改容器内容。
sort
函数的使用
sort
函数位于头文件<algorithm>
,它接受两个迭代器参数first
和last
,代表要排序的范围,为左闭右开,即[first,last)
,然后将这个范围里的元素按照升序排列。
它要求迭代器的元素类型重载了此类型对象间比较用的<
运算符。
注意:指针也可以看做是一种迭代器,所以对于数组也是可以使用这个函数的。
比如:
vector<int> v;
v.push_back(2);
v.push_back(1);
int vs[]={2,1};
sort(v.begin(),v.end()); //排序vector
sort(vs,vs + 2); //排序数组
两个容器内的元素都是:1 2
find 函数的使用
find
函数位于头文件<algorithm>
,它接受三个参数,前两个迭代器类型的first
,last
参数代表范围,左闭右开,第三个value
参数代表要查找的内容,因此元素类型必须重载了用于元素和value
之间比较的==
运算符。
它返回的也是一个迭代器,如果找到了这个元素,则返回指向这个元素的迭代器,如果没有,则返回last
参数。
比如:
vector<int> v;
v.push_back(2);
v.push_back(1);
int vs[]={2,1};
find(v.begin(),v.end(),3); //不存在3元素,所以会返回v.end()
find(vs,vs + 2,1); //返回指向数组中 1 元素的指针
注意:find
函数在比对元素的时候,==
运算符的第二个参数是要找的内容,即参数value
。