【问题标题】:sort multidimensional vector by 1st column按第一列排序多维向量
【发布时间】:2014-02-24 03:50:05
【问题描述】:

我想根据第一行的数据快速排序一个多维向量。有很多方法可以做到这一点(see answers to this post),但我正在寻找一种不使用 C++11 的快速有效方法(即,对于提供的第二种解决方案,我想避免创建和复制向量的成本)。我试图查看Boost 是否具有像 C++11 那样的不错的排序功能,但我是 C++ 的新手,无法弄清楚。本质上,我的数据看起来像:

std::vector<std::vector<double> > data(2, std::vector<double>(5, 0.0));
data[0][0] = 2.0;  data[1][0] = 4.0;
data[0][1] = 1.0;  data[1][1] = 6.0;
data[0][2] = 3.0;  data[1][2] = 5.0;
data[0][3] = 2.1;  data[1][3] = 3.3;
data[0][4] = 0.3;  data[1][4] = 5.7;

我想对数据进行排序,这样我就有了

data[0][0] = 0.3;  data[1][0] = 5.7;
data[0][1] = 1.0;  data[1][1] = 6.0;
data[0][2] = 2.0;  data[1][2] = 4.0;
data[0][3] = 2.1;  data[1][3] = 3.3;
data[0][4] = 3.0;  data[1][4] = 5.0;

请注意,我使用的是向量,因为我事先不知道数据的尺寸,但是数据将是矩形的,并且比此处提供的 2x5 示例大得多。

【问题讨论】:

  • 您不需要 C++11 来执行此操作。您可以编写自己的比较器函子并使用std::sort() 无论如何。也不需要升压。请参阅提供的链接中的 (2) 选项了解如何执行此操作。
  • 你总是在内部使用 3 个元素的向量吗?仅存储三个双精度数(固定数量,小尺寸)std::vector 可能会过大且成本高
  • 你确定最后一个块中描述的数字是你所期望的吗?这不是根据第一列中的数据排序
  • 同样,现在我盯着发布的期望,我不完全确定 what 正在排序。看起来您对第一个 vector 进行了排序,并在剩余的向量(本示例中只有一个向量)中预期匹配的槽位来进行骑行。如果这是正确的,我将放弃我的答案,因为它没有做那样的事情。 (我同意大卫关于矫枉过正的观点。如果std::array 总是 3 个插槽,它们可能会是更好的匹配)。

标签: c++ sorting vector


【解决方案1】:

首先,声明一个仿函数:

struct FirstColumnOnlyCmp
{
    bool operator()(const std::vector<double>& lhs,
                    const std::vector<double>& rhs) const
    {
        return lhs[0] < rhs[0];
    }
};

然后,在您的 std::sort 调用中使用它:

std::sort(data.begin(), data.end(), FirstColumnOnlyCmp());

就是这样。 C++11 不是必需的,它只是让这些事情变得更加容易,因为您可以在 lambda 而不是仿函数中完成所有这些操作。

我把它留给你确保data 集合中的所有向量至少有一个元素以避免调用 UB(我假设他们这样做,否则你的比较逻辑可能需要变得更复杂一些。

【讨论】:

  • +1,虽然答案中没有描述性能,但它应该尽可能好。 sort 函数将使用 swap,而这又将只交换三个指针(假设是无状态分配器)。 更新:当心:这可能不是解决问题的正确解决方案。这不会产生问题中的预期输出。
  • @DavidRodríguez-dribeas 我看了它两次,现在我明白你在说什么了。额外的间接性就是我所知道的。现在我必须凝胶,看看它是否像这样立即可行。感谢收看。
  • 这个问题令人困惑,因为措辞与示例显示的内容不同。
  • 这个答案几乎是我一直在寻找的解决方案。如果我重新组织我的数据,使向量为:std::vector&lt;std::vector&lt;double&gt; &gt; data(5, std::vector&lt;double&gt;(2, 0.0));(即交换行和列),那么我可以正确执行排序过程。谢谢!
  • @namu 我想知道你之前是否已经转置了矩阵(或者必须之后),如果这会做你想要的。对预期结果的混淆感到抱歉。很有意思。很高兴它有帮助。
猜你喜欢
  • 2016-07-19
  • 1970-01-01
  • 1970-01-01
  • 2021-05-03
  • 1970-01-01
  • 2016-11-07
  • 1970-01-01
  • 1970-01-01
  • 2019-06-30
相关资源
最近更新 更多