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;
 } 

 

posted @ 2022-07-24 16:00  yddl  阅读(16)  评论(0编辑  收藏  举报