我想根据规则对 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};
我需要根据 sortRule
对 list
进行排序,即:
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 让排序变得更容易。
我有一个列表:
std::list<std::string> list = {data2, data2, data2, data3, data3, data1, data1};
我有一个排序规则:
std::list<std::string> sortRule = {data1, data2, data3};
我需要根据 sortRule
对 list
进行排序,即:
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 让排序变得更容易。