我正在尝试使用sort C ++函数对存储在向量上的结构进行排序。我之前没有遇到任何问题。但是我没有获得所需的输出。
如果我自己尝试比较函数它可以工作,但是一旦我使用了排序C ++函数,比较函数似乎不起作用。
这个想法是将int数组按升序排列为二进制数。我知道有不同的方法,但我不明白为什么这不起作用。
预期输出为:
0000000000
0101010101
0110110110
输出结果为:
0000000000
0110110110
0101010101
我不明白这里发生了什么。这是我的代码:
using namespace std;
int n;
struct solucion{
int array[150];
};
vector <solucion> soluciones;
bool compare(solucion solucion1, solucion solucion2){
for(int i=1;i<=n;i++)
if(solucion2.array[i]>solucion1.array[i])
return true;
return false;
}
void print() {
for(int i=0;i<soluciones.size();i++){
for(int k=1;k<=n;k++)
cout << soluciones.at(i).array[k];
cout << endl;
}
}
int main(int argc, char *argv[])
{
solucion solucion1;
solucion1.array[1]=0;
solucion1.array[2]=0;
solucion1.array[3]=0;
solucion1.array[4]=0;
solucion1.array[5]=0;
solucion1.array[6]=0;
solucion1.array[7]=0;
solucion1.array[8]=0;
solucion1.array[9]=0;
solucion1.array[10]=0;
solucion solucion2;
solucion2.array[1]=0;
solucion2.array[2]=1;
solucion2.array[3]=0;
solucion2.array[4]=1;
solucion2.array[5]=0;
solucion2.array[6]=1;
solucion2.array[7]=0;
solucion2.array[8]=1;
solucion2.array[9]=0;
solucion2.array[10]=1;
solucion solucion3;
solucion3.array[1]=0;
solucion3.array[2]=1;
solucion3.array[3]=1;
solucion3.array[4]=0;
solucion3.array[5]=1;
solucion3.array[6]=1;
solucion3.array[7]=0;
solucion3.array[8]=1;
solucion3.array[9]=1;
solucion3.array[10]=0;
soluciones.push_back(solucion1);
soluciones.push_back(solucion2);
soluciones.push_back(solucion3);
n=10;
sort(soluciones.begin(),soluciones.end(),compare);
print();
system("PAUSE");
return EXIT_SUCCESS;
}
答案 0 :(得分:4)
您的比较函数未在数组上正确建立strict weak ordering(例如,如果solucion1 = {1,0,1}
和solucion2 = {0,1,0}
则根据您的比较函数solucion1 < solucion2
和solucion2 < solucion1
{1}}将是真的,这显然是荒谬的。)
您应该将定义比较更改为提供此类排序的内容,例如std::lexicographical_compare。
bool compare(solucion solucion1, solucion solucion2){
return std::lexicographical_compare(
solucion1.array+1, solucion1.array+1+n,
solucion2.array+1, solucion2.array+1+n);
}
答案 1 :(得分:3)
一旦看到正确的结构较少,就需要返回false:
bool compare(solucion solucion1, solucion solucion2){
for(int i=1;i<=n;i++) {
if(solucion2.array[i] > solucion1.array[i])
return true;
else if (solucion2.array[i] < solucion1.array[i])
return false;
}
return false;
}
更好的初始化方法:
solucion solucion1 = {{0,0,0,0,0,0,0,0,0,0,0}};
solucion solucion2 = {{0,0,1,0,1,0,1,0,1,0,1}};
solucion solucion3 = {{0,0,1,1,0,1,1,0,1,1,0}};
答案 2 :(得分:0)
你的解决方案崩溃了,试试
bool compare(solucion solucion1, solucion solucion2){
for(int i=1;i<=n;i++)
{
if(solucion2.array[i]>solucion1.array[i])
return true;
else
return false;
}
}