概述
在介绍vector之前,我们先来说一下STL中的iterator。
除了使用下标来访问vector对象的元素外,标准库提供了另一种访问元素的方法“迭代器”。
在STL中,大体可以分为容器(顺序容器、关系容器),迭代器,算法三大类。
而iterator可以看作是STL容器的指针,可以更为方便地访问容器里的元素。
1.iterator的基本操作
每个标准库容器类型都定义了一个名为iterator的成员,所以在声明迭代器的时候要用这种形式来声明该容器的迭代器 :容器名::iterator 变量名
//这条语句声明了一个名为iter的变量,它的数据类型是由vector< int >定义的iterator类型。
vector< int>::iterator iter;
2.begin和end操作
每种容器都定义了一对命名为begin和end的函数,用于返回迭代器。如果容器中有元素的话,由begin返回指向第一个元素的迭代器。
vector< int>::iterator iter = ivec.begin();
//这条语句把迭代器iter初始化为由名为begin的vector操作的返回值。如果vector非空,初始化后,iter即指该元素为ivec[0]
由end操作返回的一个指向vector的末端元素的下一个迭代器。称为“超出末端迭代器”,表明它指向了一个不存在的元素。如果噢vector为空,begin返回的迭代器与end返回的迭代器相同。
//用迭代器遍历输出容器中的元素
容器名::iterator iter;
for(iter = 容器.begin();iter != 容器.end();iter++)
{
cout << *iter << ' ';
}
3.另外,在关系容器中(例如map),初始化iter为m.begin(),这个时候如果输出iter则会报错。
因为此时的map内部存储的是很多个pair,此时的iter指向的将会是map里的第一个pair。
(*it).first会得到key,( *it).second会得到value,这等同于it -> first和it -> second。一般用->符号来访问关联容器中的元素。
4.iterator的其他操作
iter + n //迭代器指向原来 + n个位置的元素
iter1 == iter2 //如果两个迭代器指向的位置相同,返回true
iter1 = iter2 //将iter2指向的位置赋值给iter1
iter1 - iter2 //返回iter1和iter2在容器内的位置的差值
例子:iterator二分查找
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector<int> v;
v.push_back(2);
v.push_back(5);
v.push_back(20);
int temp = 0;
cin >> temp;
sort(v.begin(),v.end());//使用排序函数对容器vector中的元素进行排序
vector<int>::iterator beg = v.begin();
vector<int>::iterator end = v.end();
vector<int>::iterator mid = v.begin() + (end - beg) / 2;
while(mid != end && *mid != temp)
{
if(temp < *mid)
end = mid;
else beg = mid + 1;
mid = beg + (end - beg) / 2;
}
if(*mid == temp)
cout << "Find" << endl;
else cout << "Not find!" << endl;
return 0;
}
5.向量vector简介
vector是表示可变大小数组的序列容器。vector采用连续存储空间来存储元素。可以用数组的方式 下标访问vector的元素
刚开始vector会自动分配一段连续的存储空间,在存储的元素超过了预配空间时,vector会重新分配配置空间,元素移动,释放旧内存空间,从而达到动态存储的效果。
vector可以高效地访问愿随、在末尾添加和删除元素。但vector对元素的操作的复杂度是根据到末尾距离成正比的。
6.vector的声明和初始化
vector< int>ivies;//声明一个int型的空向量。
vector< int>ivec(5);//声明一个初始大小为5的int向量
vector< int>ivec(10,1);//声明一个初始大小为10且值都是1的向量
vector< int>ivec(tmp);//声明并用tmp向量初始化ivec向量
vector< int>ivec(tmp.begin(),tmp.begin() + 3);//用向量tmp的第0个到第2个值初始化ivec
//需要注意的是:vector不能像数组一样直接用{}初始化
int arr[5] = {1,2,3,4,5};
vector< int>ivec(arr,arr+5);//将arr数组的元素用于初始化vec向量
//说明:这里地初始化不包括arr[4]元素,括号内的第二个变量表示的是ivec.end(),末尾的迭代器都是指结束元素的下一个元素
vector< int>vec(&arr[2],&arr[4]);//将arr[2]~arr[4]范围内的元素作为vec的初始值
vector< vector< int>>Array;//类似数组,也可以有二维的vector。
7.vector的基本操作
末尾添加元素:vec.push_back();//括号内的值为需要添加的数据
末尾删除元素:vec.pop_back();
向量大小:vec.size();//返回int值,向量内元素的个数
向量判空:vec.empty();//返回0或1
插入元素:vec.insert(pos,elem);//在pos插入一个elem元素的拷贝,返回新元素的位置
vec.insert(pos,beg,end);//在pos位置插入[beg,end]区间的数据,无返回值
reverse(pos1,pos2):将vector中的pos1~pos2的元素逆序存储
vec.clear();//清空vector 注意:如果要求多组输出的情况,一定要在输出后加上clear,否则原来的数据会保留在vector中。
简单的vector操作实例:
斐波拉切数列的vector实现
#include<iostream>
#include<vector>
using namespace std;
int main()
{
vector <unsigned long long> v;
unsigned int n;
v.push_back(0);
v.push_back(1);
for(int i = 2;i < 50;i++)
v.push_back(v[i - 1] + v[i - 2]);
while(cin >> n)
cout << v[n] << endl;
return 0;
}
更多例题非对称字符串按照规定输出
Huffman树
最后
以上就是欢呼冷风为你收集整理的iterator vector的全部内容,希望文章能够帮你解决iterator vector所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复