iterator vector

在介绍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树

  • 6
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Αиcíеиτеǎг

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值