C++ Primer 学习笔记_46_STL实践与分析(20)--容器特有的算法
2020-11-23 08:57
标签:c++ 容器与算法 list 容器特有算法 与其他顺序容器所支持的操作相比,标准库为list容器定义了更精细的操作集合,使它不必只依赖于泛型操作。其中很大的一个原因就是list容器不是按照内存中的顺序进行布局的,不支持随即访问,这样,在list容器上就不能使用随即访问迭代器的算法,如sort等;还有其他的一些算法如:merge、remove、reverse和unique,虽然可以用在list上,但却付出了高昂的性能代价。因此标准库结合list的内部结构,编写出了更快算法: list容器特有的操作 lst.merge(lst2) lst.merge(lst2,comp) 将lst2的元素合并到lst中。这两个list容器对象都必须排序。lst2中的元素将被删除。合并后,lst2为空。返回void类型。第一个版本使用操作符,而第二个版本则使用comp指定的比较运算 lst.remove(val) lst.remove(unaryPred) 调用lst.erase删除所有等于指定值或指定的谓词函数返回非零值的元素。返回void类型。 lst.reverse() 反向排列lst中的元素 lst.sort() 对lst中的元素排序 lst.splice(iter,lst2) lst.splice(iter,lst2,iter2) lst.splice(iter,beg,end) 将lst2的元素移到lst中迭代器iter指向的元素前面。 在lst2中删除移出的元素。 第一个版本将lst2的所有元素移到lst中;合并后,lst2为空。lst和lst2不能是同一个list对象。 第二个版本只移动iter2所指向的元素,这个元素必须是lst2中的元素。在这种情况中,lst和lst2可以是同一个list对象。也就是说,可在一个list对象中使用splice运算移动一个元素。 第三个版本移动迭代器 beg和end标记的范围内的元素。beg和end照例必须指定一个有效的范围。这两个迭代器可标记任意list对象内的范围,包括lst。当它们指定lst的一段范围时,如果iter也指向这个范围的一个元素,则该运算未定义。 lst.unique() lst.unique(binaryPred) 调用erase删除同一个值的连续副本。第一个版本使用 ==操作符判断元素是否相等;第二个版本则使用指定的谓词函数实现判断 【最佳实践】 对于list对象,应该优先使用list容器特有的成员版本,而不是泛型算法! list容器特有的算法与其泛型算法版本之间的两个至关重要的差别。 1)、remove和 unique的 list版本修改了其关联的基础容器:真正删除了指定的元素。例如,list::unique将 list中第二个和后续重复的元素踢出了该容器。 与对应的泛型算法不同list容器特有的操作能添加和删除元素。 2)、list容器提供的merge和 splice运算会破坏它们的实参。使用 merge的泛型算法版本时,合并的序列将写入目标迭代器指向的对象,而它的两个输入序列保持不变。但是,使用list容器的 merge成员函数时,则会破坏它的实参list对象 –当实参对象的元素合并到调用 merge函数的list对象时,实参对象的元素被移出并删除。 C++ Primer 学习笔记_46_STL实践与分析(20)--容器特有的算法 标签:c++ 容器与算法 list 容器特有算法 原文地址:http://blog.csdn.net/zjf280441589/article/details/24600675
STL实践与分析
--容器特有的算法
//P362 习题11.29
bool GT4(const string &str)
{
return str.size() >= 4;
}
bool compLength(const string &s1,const string &s2)
{
return s1.size() words;
ifstream inFile("input");
string str;
while (inFile >> str)
{
words.push_back(str);
}
words.sort();
words.unique();
list
//示例程序:并不实现什么功能,只做演示之用
#include
#include
文章标题:C++ Primer 学习笔记_46_STL实践与分析(20)--容器特有的算法
文章链接:http://soscw.com/index.php/essay/22208.html