本博客知识记录自己学习中的笔记或者记录,如果有错误欢迎大家纠正。
本节主要学习特定的容器链表类型list和forward_list定义的几个算法
他们定义了特定的sort,merge,remove,reverse和unique.通用版的sort要求随机访问迭代器,因此不能用于list和forward_list,因为这两个类型分别提供双向迭代器和前向迭代器。链表通过改变元素间的链接而不是真的交换他们的值来快速交换元素
对于list和forward_list应该优先使用特定算法而不是通用算法
lst.merge(lst2)
lst.merge(lst2,comp) 将来自lst2中的元素合并入lst,lst和lst2必须是有序的。元素将从lst2中删除,在合并之后,lst变为空,第一个版本使用<运算符,第二个使用comp给定的
lst.remove(val)
lst.remove_if(pred) 调用erase删除前者调用==运算符 或令一元谓词为真的每个元素。
lst.reverse 反转lst链表元素的顺序
lst.sort()
lst.sort(comp) 前者使用<运算符 后着调用使comp为真的条件
lst.unique()
lst.unique(pred) 调用erase删除同一个值的连续拷贝,前者使用==运算符,后者使用一元谓词
lst.splice(args) 或flst.splice_after(arge)
(p,lst2) //p是一个指向lst中元素的迭代器,或一个指向flst首前位置的迭代器。函数将lst2的所有元素移动到lst中p之前的位置或flst中p之后的位置,将元素重lst2中删除。lst2的类型必须和lst或flst相同,且不能是同一个链表。
(p,lst2,p2) //p2是一个指向lst2中位置的有效的得带钱。将p2指向的元素移动到lst中,或将p2之后的元素移动到flst中,lst2可以是与lst或flst相同的链表。
(p,lst2,b,e) //b和e必须表示lst2的合法范围,将给定范围中的元素从lst2移动到lst或flst。lst2与lst(flst)可以是相同的链表,但p不能指向给定范围中的元素。
链表特有的操作会改变容器。
习题解答。
10.42 使用list代替vector重新实现10.2.3节 中去除重复单词的程序
#include <vector>
#include <list>
#include <string>
#include "stdlib.h"
#include <iostream>
#include <iterator>
#include <algorithm>
void pritef(std::list<std::string> &word)
{
for (auto s : word)
std::cout << s << " ";
std::cout << std::endl;
}
void elimDups(std::list<std::string> &word)
{
//排序
word.sort();
std::cout << "sort: ";
pritef(word);
word.unique();
std::cout << "unique: ";
pritef(word);
}
int main()
{
std::list<std::string>listStr;
std::string s = "";
while (std::cin >> s)
listStr.push_back(s);
elimDups(listStr);
system("pause");
return 0;
}
输出结果如下
本章结束,下次从第一章开始做起,跳着看,有些前面讲到的算法,在后面也不是太清楚,加油 ILVOELQ