【问题标题】:I want to sort the sheet according to the rule我想根据规则对工作表进行排序
【发布时间】:2021-07-14 13:49:36
【问题描述】:

我有一个清单:

std::list<std::string> list = {data2, data2, data2, data3, data3, data1, data1};

我有一个排序规则:

std::list<std::string> sortRule = {data1, data2, data3};

我需要根据sortRulelist进行排序,即:

list = {data1, data1, data2, data2, data2, data3, data3};

据我了解,我需要使用std::list::sort 和 lambda 函数..

【问题讨论】:

  • 你尝试了吗?它只是根据sortRule中的索引使用自定义谓词进行排序
  • 坏消息:你不能使用std::sortstd::list,不管你怎么做。 std::sort 不适用于 std::list。您需要从头开始重新考虑整个方法。
  • std::list::sort 采用自定义比较器。我看不出这与使用std::sort 有何根本不同。在实现方面它是不同的,它有不同的复杂性保证,但用法或多或少是相同的
  • @jabaa 或致电std::list::sort
  • @jabaa 首先使用std::vector 会是更好的选择;)。我不知道 std::liststd::vector 做得更好,尤其是在元素数量相当少的情况下

标签: c++ list sorting stl


【解决方案1】:

std::list 没有 RandomAccessIterator,因此您不能使用 std::sort,尽管有采用自定义谓词的 std::list::sort。您的谓词应该比较sortRule 中要比较的元素的索引:

#include <list>
#include <string>
#include <algorithm>
#include <iostream>

int main() {

    std::string data1{"data1"};
    std::string data2{"data2"};
    std::string data3{"data3"};

    std::list<std::string> list = {data2, data2, data2, data3, data3, data1, data1};
    std::list<std::string> sortRule = {data1, data2, data3};
    list.sort([&sortRule](const auto& a,const auto& b){
        auto index_a = std::distance(sortRule.begin(), std::find(sortRule.begin(),sortRule.end(),a));
        auto index_b = std::distance(sortRule.begin(), std::find(sortRule.begin(),sortRule.end(),b));
        return index_a < index_b;
    });
    for (const auto& e : list) std::cout << e << "\n";
}

输出:

data1
data1
data2
data2
data2
data3
data3

但是,这是非常低效的。在sortRule列表中查找元素需要遍历列表,计算距离需要再次遍历列表。每次比较都会这样做两次。您可以准备一个std::map&lt;std::string, size_t&gt;,以便更轻松地从字符串中查找索引。您还应该考虑使用std::vector 而不是std::list 来代替list。拥有 RandomAccessIterators 使排序更容易。

【讨论】:

    猜你喜欢
    • 2014-03-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-23
    • 1970-01-01
    • 2019-11-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多