0

我想知道如何通过将一个向量放入另一个向量中来组织它。(注意:它们是对象的向量)。到目前为止我所拥有的是:

double done;
for ( int i = 0; i < id; i++ )
{
    done = guy[i].done();
    int smallest = i;
    for( int j = i + 1; j < id; j++ ){
        if( done > guy[j].done() )
            {
                done = guy[j].done();
                smallest = j;   
            }
        }
    newGuy.push_back( guy[smallest] );
}

这不会组织向量的每个部分,有时甚至会将同一个人复制到 newGuy 中。有任何想法吗?

4

2 回答 2

3

如果您尝试对向量进行排序,您可以为您的对象定义一个自定义的小于比较器,并使用std::sort

bool myComparison(const MyType& lhs, const MyType& rhs) {
  return lhs.done() < rhs.done();
}

std::vector<MyType> guy = ....;
std::sort(guy.begin(), guy.end(), myComparison);

如果您希望所有内容都转到一个新向量,则只需复制原始向量,然后对副本进行排序:

std::vector<MyType> newGuy = guy;
std::sort(newGuy.begin(), newGuy.end(), myComparison);
于 2012-08-21T12:43:52.343 回答
1

因为当您将最小的人放入新数组时,您并没有从旧数组中删除它。考虑价值观[5,4,3,2,1]

您的算法将在第一个值上i找到最小的值j=4 (value 1)并将 1 推到新数组上,然后它将执行此操作i=2,依此类推,直到您只有[1,1,1,1,1]

这是您正在做的事情,其中​​粗体数字是被循环的数字,第二个数组是输出数组。

通过 1:
[ 5 , 4 , 3 , 2 , 1 ]
[1]

传球 2:
[5, 4 , 3 , 2 , 1 ]
[1,1]

传球 3:
[5, 4, 3 , 2 , 1 ]
[1,1,1]

传球 4:
[5, 4, 3, 2 , 1 ]
[1,1,1,1]

传球 5:
[ 5,4,3,2,1 ] [ 1,1,1,1,1
]

每次将它添加到新向量时,只需从旧向量中删除您刚刚发现的最小的项目。当然,正如其他人指出的那样,实际上只使用 std 的排序算法会更好

于 2012-08-21T12:49:04.390 回答