迭代器与指针类似
只有string和vector等一些标准库类型有下标运算符
所以使用迭代器也能访问string对象字符和vector对象的元素
使用迭代器
auto b=v.begin,e=v.end();//end成员负责返回容器(或string) 尾元素的下一个位置 的迭代器,称为 尾后迭代器
int arr[5]={0,1,2,3,4};
vector<int> vec(begin(arr),end(arr));//数组初始化vector
迭代器与运算符
*it
#include<iostream>
#include<string>
using std::string;
using std::cout;
int main()
{
string s("hello word");
if (s.begin() != s.end())
{
auto it = s.begin();
*it = toupper(*it);//*it返回迭代器it所指向的元素的引用
}
cout << s;
return 0;
}
it++
#include<iostream>
#include<string>
using std::string;
using std::cout;
int main()
{
string s("hello word");
for (auto it = s.begin(); it != s.end() && !isspace(*it); ++it)//++it 使迭代器移动到下一个字符
//习惯使用 != 。所以标准迭代器都定义了!=而不是<
*it = toupper(*it);
cout << s;
return 0;
}
(*it).num 和it->num 意思相同//解引用
解引用迭代器可获得迭代器所指向的对象,如果对象类型为类,有可能希望进一步访问其成员
//3.22对每个字符改成大写
#include<iostream>
#include<vector>
#include<string>
using std::string;
using std::vector;
using std::cout;
using std::endl;
int main()
{
vector<string> v{ "hi", "i", "am", "amy" };
for (auto it = v.begin();it != v.end(); ++it)
{
for (auto &s1 = it->begin();s1 != it->end(); s1++)
//s1为string的迭代器,使用引用来改变字符串字符
{
*s1 = toupper(*s1);
}
}
for (auto c : v)
cout << c << " ";
return 0;
}
迭代器类型
vector<int>::iterator it;
string::iterator it2;
vector<int>::const_interator it3;
string::const_interator it4;
每个容器类定义一个名为interator的类型,该类型支持迭代器类型的一系列操作
end与begin运算符的返回值
vector<int> v;
auto it1=v.begin();//auto 为 vector<int>::interator
使用迭代器运算——二分搜索
#include<iostream>
#include<vector>
using std::vector;
using std::cout;
using std::endl;
int main()
{
vector < int > num{0,1,2,3,4,5,6,7,8,9 };
int sought;
std::cin >> sought;
auto begin = num.begin();
auto end = num.end();
auto mid = num.begin() + (end-begin) / 2;
while (mid != end && *mid != sought)
{
if (*mid < sought)
begin = mid+1;
else
end = mid ;
mid = begin+(end - begin) / 2;//新的中点
//mid = (begin + end) / 2;
/*Error 1 error C2678: binary '+' : no operator found which takes a left-hand operand of type 'std::_Vector_iterator<std::_Vector_val<std::_Simple_types<int>>>' (or there is no acceptable conversion) h:\c++\project\11.5\11.5\erfensousuo.cpp 21 1 11.5*/
//+重载运算符的左右操作数类型不符合
}
cout << *mid;
return 0;
}