我想根据规则对 sheet 进行排序

I want to sort the sheet according to the rule

我有一个列表:

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 函数..

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<std::string, size_t> 以便更容易地从字符串中查找索引。您还应该考虑使用 std::vector 而不是 std::list 来表示 list。拥有 RandomAccessIterators 让排序变得更容易。