【发布时间】: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 个插槽,它们可能会是更好的匹配)。