list 容器上的迭代器是双向的,而不是随机访问类型。
由于 list 容器不支持随机访问,因此,在此容器上不能使用需要随机访问迭代器的算法。
这些算法包括 sort 及其相关的算法。
还有一些其他的泛型算法,如 merge、remove、reverse 和 unique,
虽然可以用在 list 上,但却付出了性能上的代价。
如果这些算法利用 list 容器实现的特点,则可以更高效地执行。
如果可以结合利用 list 容器的内部结构,则可能编写出更快的算法。
与其他顺序容器所支持的操作相比,标准库为 list 容器定义了更精细的操作集合,使它不必只依赖于泛型操作。
表 11.4 列出了 list 容器特有的操作,其中不包括要求支持双向或更弱的迭代器类型的泛型算法,
这类泛型算法无论是用在 list 容器上,还是用在其他容器上,都具有相同的效果。
// 表 11.4. list 容器特有的操作 lst.merge(lst2) lst.merge(lst2, comp) 将 lst2 的元素合并到 lst 中。这两个 list 容器对象都必须排序。lst2 中的元素将被删除。 合并后,lst2 为空。返回 void 类型。 第一个版本使用 < 操作符,而第二个版本则使用 comp 指定的比较运算 lst.remove(val) lst.remove_if(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 容器特有的算法类似于其泛型形式中已经见过的相应的算法,但并不相同:
l.remove(val); // removes all instances of val from 1 l.remove_if(pred); // removes all instances for which pred is true from 1 l.reverse(); // reverses the order of elements in 1 l.sort(); // use element type < operator to compare elements l.sort(comp); // use comp to compare elements l.unique(); // uses element == to remove adjacent duplicates l.unique(comp); // uses comp to remove duplicate adjacent copies
list 容器特有的算法与其泛型算法版本之间有两个至关重要的差别。
其中一个差别是 remove 和 unique 的 list 版本修改了其关联的基础容器:真正删除了指定的元素。
例如,list::unique 将 list 中第二个和后续重复的元素删除出该容器。
与对应的泛型算法不同,list 容器特有的操作能添加和删除元素。
另一个差别是 list 容器提供的 merge 和 splice 运算会破坏它们的实参。
使用 merge 的泛型算法版本时,合并的序列将写入目标迭代器指向的对象,而它的两个输入序列保持不变。
但是,使用 list 容器的 merge 成员函数时,则会破坏它的实参 list 对象——
当实参对象的元素合并到调用 merge 函数的 list 对象时,实参对象的元素被移出并删除。