10.4再探迭代器笔记

10.4.1插入迭代器
    Push_back()将一个元素追加到一个容器的尾部,除array和forward_list之外,每个顺序容器都支持push_back (vector, deque, string, list)
    pop_back() 则是删除容器尾部的一个元素,适用范围和push_back()一样
    Push_front()将一个元素追加到一个容器的头部,适用容器为list, forward_list, deque

    pop_front() 则是删除容器头部的一个元素,适用范围和push_front()一样

    包括array在内的每个顺序容器都有一个front成员函数,而出forward_list之外的所有顺序容器都有一个back成员函数。这两个操作分别返回首元素和尾元素的引用

list<int> lst1 { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
	list<int> lst2, lst3;
copy(lst1.cbegin(), lst1.cend(), front_inserter(lst2));  // lst2 { 9, 8, 7, 6, 5, 4, 3, 2, 1 };
copy(lst1.cbegin(), lst1.cend(), inserter(lst3, lst3.begin()));  // lst3 { 1, 2, 3, 4, 5, 6, 7, 8, 9 };
It = t ,或者*it = t在it指定的当前位置插入值t。假定c是it绑定的容器,依赖于插入迭代器的不同种类,此赋值会分别调用c.push_back(t), c.push_front(t)或c.insert(t,p),其中p为传递给inserter的迭代器位置

*it,++it, it++ 这些操作虽然存在,但不会对it做任何事情。每个操作都返回it

    Back_inserter 创建一个使用push_back的迭代器
    Front_inserter创建一个使用push_front的迭代器
    inserter创建一个使用inerter的迭代器。此函数接受第二个参数,这个参数必须是一个指向给定容器的迭代器。元素将被插入到给定迭代器所表示的元素之前。

    list容器中的元素不支持sort排序
    unique_copy表示拷贝不重复元素到目的位置。

    使用unique或unique_copy之前一定要先排序,因为unique去除的是相邻的重复元素,所以一般用之前都会要排一下序。unique返回一个指向不重复值范围末尾的迭代器。对于不相邻的元素,如果重复了是不会去除的

Int a, *p = &a; 或者是int a, *p; *p = &a;
10.4.2 iotream迭代器
istream_iterator<int> int_it(cin);   //从cin读取int
istream_iterator<int> eof;   //尾后迭代器
vector<int> vec;
while (int_it != eof)   
    vec.push_back(*int_it++);  //用istream_iterator从标准输入读取数据,存入一个vector
for (auto c : vec)
         cout << c << " ";
cout << endl;
    eof被定义为空的istrem_iterator, 从而可以当做尾后迭代器来使用,对于一个绑定到流的迭代器,一旦其关联的流遇到文件尾货遇到IO错误,迭代器的值就与尾后迭代器相等。
下面这段程序可达到上面程序相同的效果
istream_iterator<int> int_it(cin);
istream_iterator<int> eof;
vector<int> vec(int_it, eof);
for (auto c : vec)
	cout << c << " ";
cout << endl;
对输入流求和
istream_iterator<int> in(cin), eof;
cout << accumulate(in, eof, 0) << endl;
将vector中的元素输出:
ostream_iterator<int> out_iter(cout, " ");
for (auto e : vec)
	*out_iter++ = e; // 赋值语句实际上将元素写到cout,解引用和递增运算可忽略,因为这两个运算符对out_iter无影响,不起作用,可将它们去掉,但是不建议将他们去掉,因为这样的写法可以时六迭代器的使用宇以他迭代器的使用保持一致。
cout << endl;

    当创建一个ostream_iterator是,我们可以提供(可选的)的第二参数,它是一个字符串,在输出每个元素后都会打印此字符串。此字符串必须是一个C风格字符串(即,一个字符串字面值后这一个指向一空字符结尾的字符数组的指针)。必须将ostream_iterator绑定到一个指定的流,不允许空的或表示尾后位置的ostream_iterator.
out_iter = 100;//输出100


可以通过调用copy来打印vec中的元素,这比编写循环更简单:
copy(vec.begin(), vec.end(), out_iter);
或者是copy(vec.begin(), vec.end(), ostream_iterator(cout, " ")//临时创建一个未命名的输出迭代器对象
Cout << endl;

猜你喜欢

转载自blog.csdn.net/qq_41767116/article/details/80977182
今日推荐