迭代器
在STL的容器中,其中string和vector可以用下标来访问元素,有些不行。
使用迭代器访问STL容器元素是一种通用的方式。
auto b = v.begin(); //begin成员负责返回 指向第一个元素的迭代器
auto b = v.begin(); //end成员负责返回 指向“尾元素的下一个位置”的迭代器
若容器为空,begin和end返回的是同一个迭代器,即尾迭代器
迭代器运算符
与指针类似
*iter //返回迭代器iter所指元素的 引用
iter->mem //解引用iter 并获取mem成员
++iter //令iter指向容器的 下一个容器
--iter //
iter1 == iter2 //指向同一个元素或者都是 尾迭代器,则相等
iter1 != iter2 //反之,不相等
使用迭代器时,使用==和!=,不要使用<,因为STL容器的迭代器都定义了 ==和!=,而<大多没有定义。
迭代器类型
iterator的对象可读可写;
const_iterator的对象可读不可写。
使用auto,如果容器对象是常量,begin和end返回const_iterator;如果不是常量,返回iterator。
使用auto,cbegin和cend 默认返回const_iterator。
使用迭代器的循环体,不要向迭代器所属容器添加元素
string和vector的迭代器
iter +n //返回新迭代器,指向的新位置相比原来 **向后**移动了若干元素。
iter -n //返回新迭代器,指向的新位置相比原来 **向前**移动了若干元素。
iter1 +=n //
iter1 -=n //
iter1 -iter2//迭代器相减得到 它们之间的距离n。iter1移动n距离即可到iter2
> >= < <= //迭代器指向元素 在容器中的位置决定大小,第二个元素大于第一个元素。
验证一下前后的问题,按习惯说,下标小为前,看原文看蒙了。
iter加了n,应该是往后移了n吧!!!
看下面的代码,begin指向第一个元素1,end指向最后一个元素10的下一个元素,发现it1 < it2为真。
vector<int> vi{ 1,2,3,4,5,6,7,8,9,10 };
auto it1 = vi.begin(), it2 = vi.end();
cout << "it1 < it2 : "<<(it1 < it2) << endl;//结果为真
cout << "*(it1 + 3): " << *(it1 + 3) << endl;//结果为4,(元素1往后移动3,到元素4的位置)
cout << "(it1 + 11)==it2: " << ((it1 + 10)==it2 )<< endl;//true。
cout << "(it1 + 11)==it2: " << ((it1 + 11)==it2 )<< endl;//越界报错。
使用迭代器实现二分搜索
//text必须是有序的
vector<string> text{"asd", "bkg", "cpu", "hd"};
string sought("cpu");
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end-beg)/2;
while(mid != end && *mid != sought){
if(*mid < sought)
beg = mid +1;
else
end = mid;
mid = beg + (end-beg)/2;
习题
3.22 将string对象中中的单词改成大写,输出
string s = "hello world";
for (auto it = s.begin(); it != s.end()&& !isspace(*it); ++it)
*it = toupper(*it);
cout<<*it<<endl;
3.23 创建包含十个整数的vector对象,使用迭代器将元素变成两倍,输出
vector<int> vi{1,2,3,4,5,6,7,8,9,10};
for(auto it= vi.begin();it != vi.end(); ++it){
*it *=2;
cout<<*it<<endl;
}
3.24 将3.20重写
void q3_24() {
int s;
char c1;
vector<int> v;
//while ((cin >> s).get(c1)) {
// v.push_back(s);
// if (c1 == '\n')
// break;
//}
for (unsigned i = 0; i != 10; i++)
{
cin >> s;
v.push_back(s); //创建含有10个整数的vector对象
}
size_t size = v.size();
for (auto beg = v.begin(); beg != v.end() - 1; ++beg) {
cout << *beg + *(beg + 1) << " ";
}
cout << endl;
for (auto i = v.begin(), j = v.end(); i != v.begin()+ (v.end()-v.begin()) / 2; ++i) {
--j;
cout << *i + *j << " ";
}
}
3.25
以十分为一个分数段统计成绩的数量
void q3_25() {
vector<unsigned> scores(11, 0);
unsigned grade;
char c1;
auto it = scores.begin();
while ((cin >> grade).get(c1)) {
if (grade <= 100)
++(*(it + (grade / 10)));
if (c1 == '\n')
break;
}
}
3.26
mid = beg+ (end- beg) /2
mid = (beg + end) /2 //报错,没有与之匹配的“+”运算符。