C++primer练习10.38
练习10.38
列出5个迭代器类别,以及每类迭代器所支持的操作
::input_iterator输入迭代器可以读取序列中的元素,支持比较两个迭代器的1. 比较两个迭代器是否相等(==、!=)。
2. 前置和后置递增运算(++)(意味着它是单向移动的)。
3. 读取元素的解引用运算符(*)。只能读元素,也就是解引用只能出现在赋值运算符的右边。
4. 箭头运算符(->),解引用迭代器,并提取对象的成员。
5. 只能用于单遍扫描算法。
output_iterator输出迭代器 ,只写不读,1. 比较两个迭代器是否相等(==、!=)。
2. 前置和后置递增运算(++)(意味着它是单向移动的)。
3. 读取元素的解引用运算符(*)。只能写元素,也就是解引用只能出现在赋值运算符的左边。
4. 箭头运算符(->),解引用迭代器,并提取对象的成员。
5. 只能用于单遍扫描算法。
forward iterator与输入迭代器的操作相似,只不过输入变成了输出。
1. 比较两个迭代器是否相等(==、!=)。
2. 前置和后置递增运算(++)(意味着它是单向移动的)。
3. 读取元素的解引用运算符(*)。可写也可读。
4. 箭头运算符(->),解引用迭代器,并提取对象的成员。
5. 能用于多遍扫描算法。
bidirectional iterator1. 比较两个迭代器是否相等(==、!=)。
2. 前置和后置递增运算(++)。
3. 前置和后置递减运算(–)(意味着它是双向移动的)。
3. 读取元素的解引用运算符(*)。可写也可读。
4. 箭头运算符(->),解引用迭代器,并提取对象的成员。
5. 能用于多遍扫描算法。
random-access iterator
1. 比较两个迭代器是否相等(==、!=),以及比较两个迭代器相对位置的关系运算符(<、<=、>和>=)。
2. 前置和后置递增运算(++)。
3. 支持和一个整数值的加减运算(+、+=、-、-=)。
4. 两个迭代器上的减法运算符(-),得到两个迭代器的距离。
5. 前置和后置递减运算(–)(意味着它是双向移动的)。
6. 读取元素的解引用运算符(*)。可写也可读。
7. 箭头运算符(->),解引用迭代器,并提取对象的成员。
8. 支持下标运算符(iter[n]),与*(iter[n])等价,访问距离起始迭代器n个距离的迭代器指向的元素。
9. 能用于多遍扫描算法。
练习10.39
list上的迭代器属于哪类?vector呢?
::list上的迭代器属于双向迭代器,vector上的迭代器属于随机访问迭代器。
练习10.40
你认为copy要求哪类迭代器?reverse和unique呢?
::reverse至少要求双向迭代器。unique顺序扫描元素,覆盖重复元素,因此要求两个参数至少是前向迭代器。
练习10.41
仅根据算法和参数的名字,描述下面每个标准库算法执行什么操作:
replace(beg,end,old_val,new_val);替换范围序列内等于old_val的值,全部换成new_val
replace_if(beg,end,pred,new_val);替换范围序列使pred为真的值为new_val
replace_copy(beg,end,dest,old_val,new_val);范围序列内等于old_val的值,全部换成new_val拷贝到dest
replace_copy_if(beg,end,dest,pred,new_val);替换范围序列使pred为真的值为new_val,拷贝到dest
练习10.42
使用list代替vector重新实现去除重复单词的程序
int main() { list<string> a{"beauty","day","eye","yeah","beauty"}; a.sort(); a.unique(); for(auto d:a) cout<<d; cout<<endl; return 0; }