复制/移动/交换是否也对std :: set / map的比较器进行操作?

时间:2017-10-08 05:54:37

标签: c++ set comparator swap

哪些移动分配,复制分配和交换操作(如果有的话)也可以在集合和映射的嵌入式比较器上运行?

(换句话说,如果我swap两个set,他们的比较器也会被交换,或者没有?)

如果旧版本的C ++(例如C ++ 98或C ++ 03)的答案不同,请提及。

2 个答案:

答案 0 :(得分:1)

标准包含以下保证

  

对于关联容器,除非交换容器的Compare对象(如果有)抛出异常,否则交换函数不会抛出异常。

答案是肯定的 - 交换函数也会交换比较对象。

引用的是C ++ 11-17。我没有早期的草稿。

对于复制和移动 - 我只能推断 - 由于任何合理的复制/移动实现使用交换,相同的答案都是正确的。但我还没有找到具体的引用......

答案 1 :(得分:1)

引用n1905(我可以找到最接近官方2003年出版物,虽然它是后来的),根据一般的容器要求:

[lib.container.requirements] / 11:

  

除非另有说明,否则所有容器   本节中定义的类型符合以下附加条件   要求:

     
      
  • 没有swap()函数抛出异常,除非该复制构造函数或赋值运算符抛出该异常   容器的比较对象
  •   

因此,如果一个Compare对象需要复制,这几乎指明它应该被复制。