Effective STL

【Effective STL(4)】迭代器

2018-03-12  本文已影响31人  downdemo

26 尽量用iterator代替const_iterator,reverse_iterator和const_reverse_iterator

typedef deque<int> IntDeque;
typedef IntDeque::iterator Iter;
typedef IntDeque::const_iterator ConstIter;
Iter i;
ConstIter ci;
if (i == ci) ... // iterator隐式转换成const_iterator再比较
// 而有时编译器把operator==作为const_iterator的一个成员函数
// 上面的代码就无法编译,解决方法是交换两个迭代器位置
if (ci == i)...
if (i - ci >= 3) ...
// 如果无法编译则需要把iterator转为const_iterator
if (static_cast<ConstIter>(i) - ci >= 3) ...
// 最简单的做法就是不要混用iterator和const_iterator

27 用distance和advance把const_iterator转化成iterator

typedef deque<int> IntDeque;
typedef IntDeque::iterator Iter;
typedef IntDeque::const_iterator ConstIter;
IntDeque d;
ConstIter ci;
... // 让ci指向d
Iter i(d.begin()); // 初始化i为d.begin()
advance(i, distance(i, ci)); // 把i移到指向ci位置
template<typename InputIterator>
typename iterator_traits<InputIterator>::difference_type
distance(InputIterator first, InputIterator last);
advance(i, distance<ConstIter>(i, ci));

28 了解如何通过reverse_iterator的base得到iterator

vector<int> v;
v.reserve(5);
for(int i = 0;i < 5; ++ i) v.push_back(i);
vector<int>::reverse_iterator ri = find(v.rbegin(), v.rend(), 3);
vector<int>::iterator i(ri.base()); // 使i和ri的base一样
下方红箭头为ri.base()
vector<int> v;
v.reserve(5);
for(int i = 0;i < 5; ++ i) v.push_back(i);
vecot<int>::reverse_iterator ri = find(v.rbegin(), v.rend(), 3);
v.erase(--ri.base());
v.erase((++ri).base());

29 需要一个一个字符输入时考虑使用istreambuf_iterator

ifstream inputFile("interestingData.txt");
string fileData((istream_iterator<char>(inputFile)),  istream_iterator<char>());
ifstream inputFile("interestingData.txt");
inputFile.unset(ios::skipws); // 关闭inputFile的忽略空格标志
string fileData((istream_iterator<char>(inputFile)), istream_iterator<char>());
ifstream inputFile("interestingData.txt");
string fileData((istreambuf_iterator<char>(inputFile)), istreambuf_iterator<char>());
上一篇 下一篇

猜你喜欢

热点阅读