【问题标题】:Sort std::vector by an element inside?按里面的元素对std :: vector进行排序?
【发布时间】:2010-06-08 07:44:09
【问题描述】:

我目前有一个 std::vector,它持有双精度的 std::vector。我想按双向量的第二个元素对其进行排序。前任: 我不是按 MyVec[0] 或 myvec[1] 排序,而是根据 myvec[0][1] myvec[1][1] 对 myVec[0] 和 myvec[1] 进行排序。基本上按包含的值排序,而不是其中的对象。

所以如果 myvec[0][1] 小于 myvec[1][1] 那么 myvec[0] 和 myvec[1] 将交换。 谢谢

【问题讨论】:

  • 有什么原因不能从数组中复制键值然后排序以防止出现竞争条件?
  • @Michael,上面介绍的比赛条件怎么样?就个人而言,我更关心的是确保这个向量向量中的每个元素至少有 2 个元素。我将被包括使用at 函数而不是下标运算符,只是为了抓住这一点。
  • 根据比较的编写方式,在排序的中途,元素[1]可能会因排序而改变,然后如果值未缓存,可能会发生不好的事情。

标签: c++


【解决方案1】:

只写比较器:

bool my_comparator(const std::vector<double>& lhs, const std::vector<double>& rhs)
{
  assert(lhs.size() >= 2 && rhs.size() >= 2);
  return lhs[1] < rhs[1];
}
...
std::sort(big_vector.begin(), big_vector.end(), my_comparator);

写一个函子比写一个函数更好,但概念是一样的。

【讨论】:

  • 这让我害怕...没有检查以确保 lhs 和 rhs 是否有 size() &gt;= 2。我可以建议以下之一:assert(lhs.size() &gt;= 2) &amp;&amp; assert(rhs.size() &gt;= 2) 在函数的入口处或return lhs.at(1) &lt; rhs.at(1)。第一个只会在调试编译下检查,但会增加一定的理智。第二个将在调试和发布版本下检查,但会产生一些额外的开销。就目前而言,对我来说,这段代码是虚假段错误的秘诀。此外,向量的向量往往会散发出不良设计的味道,因此应仔细考虑。
  • @Nathan 健全性检查是实际代码中必须的,但这不应该是生产代码:)。无论如何,我根据您的建议更改了代码。
  • 干杯。我只是害怕将太多的答案复制/粘贴到真实代码中,所以我觉得我们一定是迂腐的。你赢得了我的 +1。
【解决方案2】:

这有点像字符串向量,除了不是字符串,我们有一个数字字符串。我想你想要这个:

[
  [1, 0, 4],
  [4, 9, 9],
  [0, 1, 9],
  [4, 5. 2]
]

...排序到...

[
  [0, 1, 9],
  [1, 0, 4],
  [4, 5. 2],
  [4, 9, 9]
]

...对吗?

为此,您需要编写一个比较器类或函数,它接受两个数字向量,如果第一个小于第二个,则返回“true”。喜欢:

bool my_comparator(const std::vector<double> &a, const std::vector<double> &b)
{
    // return true if a < b ... by comparing a[0] with b[0], etc.
}

然后将其传递给 sort():

sort(?, ?, my_comparator);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-09-19
    • 2011-06-04
    • 2023-03-10
    • 1970-01-01
    • 2021-01-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多