2010-06-07 44 views
0

我目前有一个std :: vector,它包含double的std :: vector。我想按双vectore的第二个元素进行排序。例如: 而不是按MyVec [0]或myvec [1]排序,然后根据myvec [0] [1] myvec [1] [1]对myVec [0]和myvec [1]进行排序。基本上按照包含的值进行排序,而不是其中的对象。由内部的元素排序std :: vector?

因此,如果myvec [0] [1]小于myvec [1] [1],那么myvec [0]和myvec [1]将交换。 感谢

+0

任何原因,你不能键值复制出来的阵列,然后排序,防止竞争条件? – 2010-06-07 22:49:19

+0

@Michael,以上介绍的是比赛条件?就我个人而言,我更关心确保这个向量向量中的每个元素都至少有2个元素。我会被包含在使用'at'函数而不是下标操作符,只是为了解决这个问题。 – 2010-06-07 23:33:27

+0

根据比较的写法,部分路径可能会因排序而改变元素[1],然后如果值未被高速缓存,可能会发生不好的事情。 – 2010-06-08 01:18:26

回答

5

只写比较:

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); 

最好是写一个函子,而不是一个功能,但概念是相同的。

+0

这让我感到恐慌......没有检查以确保lhs和rhs是否具有size()> = 2'。我可以在函数的入口或者'return lhs.at(1)中声明以下其中一个:'assert(lhs.size()> = 2)&& assert(rhs.size()> = 2) rhs.at(1)'。第一个只会在调试编译时检查,但会增加一定的理智。第二个将检查调试和发布版本,但会有一些额外的开销。就目前而言,对我来说,这段代码是虚假分段错误的一个秘诀。此外,矢量矢量倾向于厌恶糟糕的设计,应该仔细考虑。 – 2010-06-07 23:38:02

+0

@Nathan Sanity检查是真正的代码必须的,但这不应该是生产代码:)。无论如何,我根据您的建议更改了代码。 – AraK 2010-06-07 23:43:14

+0

欢呼声。我只是害怕从答案中复制/粘贴太多到真正的代码,所以我觉得我们必须是迂腐的。你已经赢得了我的+1。 – 2010-06-07 23:50:52

1

这就像一个字符串的矢量,除了不是一串字符,我们有一串数字。我想你想要这样的:

[ 
    [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(?, ?, my_comparator); 
相关问题