【问题标题】:sorting a vector by a parameter [closed]按参数对向量进行排序[关闭]
【发布时间】:2018-09-16 10:07:20
【问题描述】:

大家好,我想做以下事情。 假设我们有一个 [1 9 6 8 9 10] 的向量,我想第一次按标准排序,第二次按其他标准排序。(例如,如果布尔变量为 True,则使用第一个标准对向量进行排序,如果这是错误的,使用第二个标准对向量进行排序。 例如,让我们按第一个条件对向量进行排序:升序 第二个标准:降序。 输出将是 [1 10 6 8 9 9]。 使用第一个标准,然后是第二个标准对向量进行排序很容易,但是使用 stl 库可以做到吗? :)

【问题讨论】:

  • std::sort 使用自定义函子?
  • 除了std::sort,我还推荐你阅读lambda expressions
  • 请在提问前使用搜索引擎(“向量排序”至少会给您一个开始,如果您遇到如何使用自定义比较器的问题,您仍然可以在这里提问)

标签: c++ stl


【解决方案1】:

std::sort 的相关重载是三元:

template< class RandomIt, class Compare >
void sort( RandomIt first, RandomIt last, Compare comp );

所以你需要通过类似的方式调用它

std::sort(vector.begin(), vector.end(), factor? first : second);

(提供 firstsecond 的类型匹配,因此第三个参数编译。

如果不是,您可以将它们包装在std::functions 或其他东西中。)

【讨论】:

  • 技术上:比较器并不需要成为一个函数。可以实现一个类,该类内部包含比较机制(并根据一些内部标志的值进行选择)。
  • 当然,我从来没有说过它必须是一个函数。它所需要的只是提供operator()std::function 是 STL 中针对此类情况的最简单的单态包装器。
  • 当然,这是最简单的。但我留下这样评论的原因是:如果您使用 class 的实例作为函子,您可以避免在每次 std::sort 调用时执行 factor? first : second,相反,您可以设置必要的标志,并保留所有内容else 函数的内部实现。
  • 嗯,“内部包含的比较机制(并根据一些内部标志的值选择)”意味着在最好的情况下每个元素都有一个分支,不是吗? 每次排序保存一个分支的代价太大了。 :-|
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-02-19
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多