【问题标题】:Sorting a Vector of Vectors对向量的向量进行排序
【发布时间】:2013-11-04 07:41:08
【问题描述】:

我有一个包含 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;
}

但是,我没有得到想要的输出。实际上输入和输出向量是相同的。我哪里做错了??我错过了什么吗??

【问题讨论】:

  • 结果是一样的,但是函数应该是bool myfunc(const vector&lt;long&gt; &amp;vec1,const vector&lt;long&gt;&amp; vec2)
  • 我不确定我是否遵循所需的逻辑,但是简单调用 std::sort 有什么问题?

标签: c++ sorting stl


【解决方案1】:

您有几个错误,但并非所有错误对您来说都是显而易见的(目前)。

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,这是更好的做法。

【讨论】:

  • 谢谢...它正在工作...检查了比较功能的文档,发现我的概念是错误的。 :) 但是我仍然将它用作 bool myfunc(vector vec1,vector vec2) 并且它正在工作。有什么我需要进一步探索的概念吗??
  • 简单调用是指没有比较功能吗??我试过了。。不行。而且我认为它不应该......因为我们正在处理无法隐式比较的向量向量。
  • @RolandIllig,a &lt; b 为假,b &lt; a 为假。因此它们彼此相等(它们可以以任何相对于彼此的顺序结束)。这遵循所描述的排序。
  • @alphacentauri,当您遍历集合时,经常使用for 循环,因为它更简洁。
  • @alphacentauri 如果你使用 bool myfunc(vector vec1,vector vec2) 向量将被复制到函数中,如果向量很大并且是不必要。这就是为什么推荐使用 const reference (const vector& vec1, ...)
【解决方案2】:

我尝试按原样实现您的代码。它似乎按降序对向量进行排序。尝试在 myfunc 函数中切换真假。

#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

切换真假后,以下代码按正确顺序对向量进行排序。

#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

【讨论】:

  • 是的...发现我的错误..谢谢..:)
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-01-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多