我想知道如何通过将一个矢量放入另一个矢量来组织一个矢量。 (注意:它们是对象的向量)。到目前为止我所拥有的是:
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中。有什么想法吗?
答案 0 :(得分: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);
答案 1 :(得分: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的排序算法实际上会更好