gpt4 book ai didi

sorting - 我可以对引用元组的向量进行排序吗?

转载 作者:行者123 更新时间:2023-12-04 08:05:01 25 4
gpt4 key购买 nike

当以下代码时:

std::vector<std::tuple<int&>> v;
int a = 5; v.emplace_back(a);
int b = 4; v.emplace_back(b);
int c = 3; v.emplace_back(c);
int d = 2; v.emplace_back(d);
int e = 1; v.emplace_back(e);
std::sort(std::begin(v), std::end(v));

使用 gcc/libstdc++ 与 clang/libc++ 二进制编译给出不同的结果。

对于 gcc/libstdc++一个元素被复制到所有其他引用。
5 4 3 2 1 
5 5 5 5 5

一开始我以为 clang/libc++行为符合预期,但它最多只能在向量中使用 5 个元素(因为小容器有特殊情况)。
5 4 3 2 1 
1 2 3 4 5

当传递更多元素时,结果类似于 gcc。
5 4 3 2 1 0 
3 4 5 5 5 5

那么使用 std::sort 是否有效?对于带有引用的元组容器(即用 std::tie 制作,对结构的子集进行排序)?
如果没有,我应该期待任何警告吗?

最佳答案

So is it valid to use std::sort for container of tuples with references (i.e. made with std::tie, sorting subset of struct)? If not, should I expect any warnings?



不,也没有。 std::sort() 上的类型要求之一就是它:

  • The type of dereferenced RandomIt must meet the requirements of MoveAssignable and MoveConstructible.


哪里 MoveAssignable 在表达式 t = rv 中需要:

The value of t is equivalent to the value of rv before the assignment.



但是 std::tuple<int&>不是 MoveAssignable 因为 int&不是 MoveAssignable。如果您只是:
int& ra = a;
int& rb = b;

ra = std::move(rb);
ra的值不等于 rb 的先验值. ra仍指 a ,引用 b不变- 实际改变的是 a 的值.

由于我们的类型不满足 std::sort()的前提条件, std::sort() 的结果调用只是未定义的行为。

请注意,您可以对 std::vector<std::tuple<std::reference_wrapper<int>>> 进行排序尽管如此,因为 std::reference_wrapper 是 MoveAssignable。

另请注意,这让人想起无法对 auto_ptr 的容器进行排序。 , 每一个古老的 Herb Sutter article .

关于sorting - 我可以对引用元组的向量进行排序吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37142510/

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