gpt4 book ai didi

c++ - 如何将 std::sort 与对和引用一起使用

转载 作者:可可西里 更新时间:2023-11-01 17:53:19 26 4
gpt4 key购买 nike

有没有一种方法可以对其中一个元素是引用的对集合进行排序?我在要对 std::vector<Ty> 进行排序的地方编写了代码, 其中Tystd::pair<A, B&>AB是类。举一个最小的、具体的例子,这里是 typedef std::pair<int, int&> Ty 的代码。 .这应该根据对的第二个元素对 vector 进行排序。

void bad() {
typedef std::pair<int, int &> Ty;
int a[N] = {17, 4, 8, 10, 0};
std::vector<Ty> v;
for (int i = 0; i < N; ++i) {
v.emplace_back(i, a[i]);
}
std::sort(v.begin(), v.end(),
[](const Ty &a, const Ty &b) { return a.second < b.second; });

std::cout << "With reference (bad):" << std::endl;
for (auto &x : v) {
std::cout << x.first << ',' << x.second << std::endl;
}
}

这个输出:

With reference (bad):
4,17
3,17
2,17
1,17
0,17

但是,如果我更改对指针的引用,它会按我预期的方式工作

void good() {
typedef std::pair<int, int *> Ty;
std::vector<Ty> v;
int a[N] = {17, 4, 8, 10, 0};
for (int i = 0; i < N; ++i) {
v.emplace_back(i, &a[i]);
}
std::sort(v.begin(), v.end(),
[](const Ty &a, const Ty &b) { return *a.second < *b.second; });
std::cout << "With pointer (good):" << std::endl;
for (auto &x : v) {
std::cout << x.first << ',' << *x.second << std::endl;
}
}

输出:

With pointer (good):
4,0
1,4
2,8
3,10
0,17

如果可能,我更愿意使用引用;有没有什么办法解决这一问题?我已尝试使用调试器进行跟踪,但我不明白为什么排序算法没有正确复制(可能交换?)这些对。

最佳答案

如果您使用 std::reference_wrapper然后它按预期工作。可用Online .

int N = 5;
typedef std::pair<int, std::reference_wrapper<int>> Ty;
int a[N] = {17, 4, 8, 10, 0};
std::vector<Ty> v;
for (int i = 0; i < N; ++i) {
v.emplace_back(i, a[i]);
}

// Print, just to be sure :)
for (auto &x : v) {
std::cout << x.first << ',' << x.second << std::endl;
}

std::sort(v.begin(), v.end(),
[](const Ty &a, const Ty &b) { return a.second < b.second; });

std::cout << "With std::reference_wrapper (good):" << std::endl;
for (auto &x : v) {
std::cout << x.first << ',' << x.second << std::endl;
}

关于c++ - 如何将 std::sort 与对和引用一起使用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44153247/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com