补充C++基础笔记。
迭代器
所有标准库容器都可以使用迭代器,但只有少数几种才同时支持下标运算符。
使用迭代器
-
begin和end begin返回指向第一个元素的迭代器auto b = v.begin() ; end返回指向容器“尾元素的下一位置”的迭代器auto e = v.end() 。 -
标准容器迭代器的运算符
*iter
iter->mem
++iter
--iter
iter1 == iter2
iter1 != iter2
一个小例子:string中的第一个字母改成大写
string s("some string");
if (s.begin() != s.end()) {
auto it = s.begin();
*it = toupper(*it);
}
- 迭代器类型:拥有迭代器的标准库使用iterator和const_iterator来表示迭代器的类型
vector<int>::iterator it;
string::iterator it2;
vector<int>::const_iterator it3;
string::const_iterator it4;
使用begin和end时,返回的类型由对象是否是常量决定,如果对象是常量,那么begin和end返回const_iterator。 C++11新标准引入了cbegin和cend,这时无论vector对象(或string对象)本身是否是常量,返回值都是const_iterator。
- 解引用和成员访问操作
解引用迭代器可以获得迭代器所指对象,若该对象的类型恰好是类,就有可能希望进一步访问它的成员,由字符串组成的vector,想检查其元素是否为空,则令it是该vector对象的迭代器,检查it所指字符串是否为空就可以: (*it).empty C++定义了箭头运算符: it -> empty() 与 (*it).empty 表达的意思相同。 小例子:输出text字符串向量中第一段的内容:
for (auto it = text.cbegin(); it != text.end && !it->empty(); ++it)
cout << *it <<endl;
- 注意点:凡是使用了迭代器的循环体,都不要向迭代器所属的容器添加元素。
迭代器运算
iter + n
iter - n
iter1 += n
iter1 -= n
>, >=, <, <=
小例子:使用迭代器完成二分搜索
auto beg = text.begin(), end = text.end();
auto mid = text.begin() + (end - beg)/2;
while (mid != end && *mid != sought) {
if (sought < *mid)
end = mid;
else
beg = mid + 1;
mid = beg + (end - beg)/2;
}
|