2014-02-24 85 views
0

我想根据第一行的数据快速排序多维向量。有办法做到这一点(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示例大得多。

+0

你你可以编写你自己的比较函子,并利用['std :: sort()'](http://en.cppreference.com/w/cpp/algorithm/sort)无论如何,Boost也不是必需的,请参阅提供的链接中的(2)选项,以了解如何完成此工作。 – WhozCraig

+0

您是否总是在内部使用3个元素的向量?为了只存储三个双精度值(固定数量,小尺寸)'std :: vector'可能是过度的和昂贵的 –

+0

你确定最后一个块中描述的数字是你期望的吗?根据第一列的数据没有排序* –

回答

4

首先,声明函子:

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而不是functor中完成所有这些。

我让你来确保data集合中的所有向量至少有一个元素,以避免调用UB(我认为他们这样做,否则,你的比较逻辑可能需要变得有点复杂。

+0

+1,而答案中没有描述表现,它应该尽可能好。 'sort'函数将使用'swap',这将反过来交换三个指针(假设一个无状态分配器)。 **更新**:谨防:这可能不是正确的解决方案,不适合发布的问题。这不会在问题中产生预期的输出。 –

+0

@DavidRodríguez-dribeas我看了两遍*,现在看到你在说什么。额外的间接是我想要的。现在我必须凝胶,看看它是否立即可以这样做。感谢您的支持。 – WhozCraig

+0

这个问题令人困惑,因为措辞表明了与示例所示不同的内容。 –