我有一个vector的向量,包含long类型的元素,如下所示:
vector< vector<long> > Data(N,vector<long>(M));
我必须根据它们的值对这些向量进行排序,即对于两个向量
Data[i] & Data[j]
if for some k Data[i][k]< Data[j][k]
and Data[i][t]==Data[j][t] for all 0<=t<=(k-1),
then Data[i] should come before Data[j] in the final vector
不是为了上述任务,我编写了以下代码:
sort(Data.begin(),Data.end(),myfunc);
where
bool myfunc(vector<long> vec1,vector<long> vec2){
int i=0;
while(i<vec1.size()){
if(vec1[i]<vec2[i]){
return false;
}
else if(vec1[i]>vec2[i]){
return true;
}
i++;
}
return false;
}
但是,我没有得到所需的输出。实际上输入和输出矢量是相同的。我哪里做错了??我错过了什么吗?
答案 0 :(得分:2)
你有几个错误,但并不是所有的错误(还)。
bool myfunc(const vector<long>& vec1, const vector<long>& vec2){
for(size_t i = 0; i < vec1.size() && i < vec2.size(); i++){
if(vec1[i] > vec2[i]){
return false;
} else if(vec1[i] < vec2[i]){
return true;
}
}
return false;
}
我冒昧地使用for
循环和size_t
,这是更好的做法。
答案 1 :(得分:1)
我尝试按原样实现您的代码。它似乎按降序对矢量进行排序。尝试从myfunc函数中切换trues和falses。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool myfunc(vector<long> vec1,vector<long> vec2){
int i=0;
while(i<vec1.size()){
if(vec1[i]<vec2[i]){
return false;
}
else if(vec1[i]>vec2[i]){
return true;
}
i++;
}
return false;
}
int main()
{
int N = 5, M = 5;
vector< vector<long> > Data(N,vector<long>(M));
for ( int i = 0; i < Data.size(); i++ ) {
for ( int j = 0; j < Data[i].size(); j++ )
Data[i][j] = 5-i;
}
sort( Data.begin(), Data.end(), myfunc );
for ( int i = 0; i < Data.size(); i++ ) {
for ( int j = 0; j < Data[i].size(); j++ )
cout << Data[i][j] << " " ;
cout << endl;
}
return 0;
}
输出:
5 5 5 5 5
4 4 4 4 4
3 3 3 3 3
2 2 2 2 2
1 1 1 1 1
在切换trues和falses之后,以下代码按正确的顺序对向量进行排序。
#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
bool myfunc(const vector<long> &vec1, const vector<long> &vec2){
int i=0;
while(i<vec1.size()){
if(vec1[i]<vec2[i]){
return true;
}
else if(vec1[i]>vec2[i]){
return false;
}
i++;
}
return true;
}
int main()
{
int N = 5, M = 5;
vector< vector<long> > Data(N,vector<long>(M));
for ( int i = 0; i < Data.size(); i++ ) {
for ( int j = 0; j < Data[i].size(); j++ )
Data[i][j] = 5-i;
}
sort( Data.begin(), Data.end(), myfunc );
for ( int i = 0; i < Data.size(); i++ ) {
for ( int j = 0; j < Data[i].size(); j++ )
cout << Data[i][j] << " " ;
cout << endl;
}
return 0;
}
输出
1 1 1 1 1
2 2 2 2 2
3 3 3 3 3
4 4 4 4 4
5 5 5 5 5