从零单排c++ primer(10)

(1)在流迭代器中,默认初始化迭代器,这样就创建了一个可以当作尾后值使用的迭代器。
(2)利用流迭代器在cin流中读取 int:

         istream_iterator<int> in_iter(cin), eof;
         vector<int> vec(in_iter , eof);

(3)istream_iterator允许使用懒惰求值。
(4) 反向迭代器的目的是表示元素范围,而这些范围是不对称的,这导致一个重要的结果:当我们从一个普通迭代器初始化一个反向迭代器,或给一个反向迭代器赋值的时候,结果迭代器与原迭代器指向的并不是一个元素。
(5) 任何算法的最基本的特性是它要求迭代器提供哪些操作。
(6)算法所要求的的迭代器操作可分为5个迭代器类别:输入迭代器,输出迭代器,前向迭代器,双向迭代器,随机访问迭代器。
(7)对于向一个算法传递错误类别的迭代器问题,很多编译器不会给出任何警告或提示。
(8)输入迭代器:可以读取序列中的元素,只用于顺序访问。只能用于单遍扫描算法。
(9) 输出迭代器:只写而不读元素,只能向一个输出迭代器赋值一次。只能用于单遍扫描算法。
(10)向前迭代器:可以读写元素,但只能在序列中沿着一个方向。可多遍扫描。
(11)双向迭代器:可以正向/反向读写序列中的元素。
(12)随机访问迭代器:提供在常量时间内访问序列中任意元素的能力。
(13)对于list和forward_list,应该优先使用成员函数版本的算法而不是通用算法。
(14)链表特有的操作会改变容器。
(15) map是关键字-值对的集合,使用事例:

                map<string , size_t> word_count;
                string word;
                while(cin >> word)
                        ++word_count[word];
                for(const auto &w : word_count)
                        count << w.first << " occurs" << w.second << ((w.second > 1) ? "times" : "time" )  << endl;

(16)关联容器的迭代器都是双向的。
(17)pair的数据成员是public的,两个成员分别命名first和second。
(18)在一个map中,元素是关键字-值对。
(19) 一个map的value_type是一个pair,我们可以改变pair的值,但不能改变关键字成员的值。
(20)关键字不重复的map的 一个使用insert成员函数的例子:

                map<string , size_t> word_count;
                string word;
                while(cin >> word)
                    {
                        auto ret = word_count.insert({word , 1});
                        if(!ret.second)
                                ++ret.first->second;
                    }


(21)关键字不重复的map删除元素的例子

                if(word_count.erase(remove_word))
                    cout << "ok: " << remove_word << " remove\n";
                else 
                    cout << "oops: " << remove_word << "not found!\n";

(22)使用一个不再容器中的关键字作为下标,会添加一个具有此关键字的元素到map中。
(23)与vector和string不同,map的下标运算符返回的类型与解引用map迭代器得到的类型不同,下标返回mapped_type对象,解引用迭代器返回value_type对象。

你可能感兴趣的:(C++,程序员,学习,语言)