将数组存储在向量中并对元素进行排序

时间:2014-04-21 17:07:54

标签: c++ algorithm sorting vector

我有三个数字组合的巨大数字列表,

有没有办法将这些数字作为一个单元存储在一个向量中,并对它们进行排序以便打印,以便根据第一个数字对这些组合进行排序,如果碰巧有重复,那么它们将根据第二个数字等等。

以下是输入的示例:

  • 234 567 234
  • 234 123 678
  • 234 123 465
  • 567 890 123

和预期的输出:

  • 234 123 465
  • 234 123 678
  • 234 567 234
  • 567 890 123

2 个答案:

答案 0 :(得分:2)

你基本上需要一个两维的integeres向量,然后你可以使用自定义比较器对它进行std :: sort。

bool vector_cmp(const vector<int> &v1, const vector<int> &v2)
{
    for (vector<int>::size_type i = 0; i < v1.size(); ++i) {
        if (v1.at(i) < v2.at(i))
            return true;
        else if (v2.at(i) < v1.at(i))
            return false;
    }
    return false;
}

vector<vector<int> > int2dVector;
// Append your internal vector in here
int2dVector << ... << ... << ...;

std::sort(int2dVector.begin(), int2dVector.end(), vector_cmp);

你也可以像这样简单地写下最后一行:

std::sort(int2dVector.begin(), int2dVector.end());

原因是operator<已经退出比较矢量。

  

操作&lt;,&gt;,&lt; =和&gt; =表现得好像使用算法lexicographical_compare,它使用运算符&lt;按顺序比较元素。反复地,在第一次不匹配时停止。

免责声明:它是完全未经测试且概念证明代码。

答案 1 :(得分:2)

定义正确比较函数的一种简单方法是使用返回负,零或正的比较函数。例如。 std::string::compare就是其中之一。

另一种方法是使用std::lexicographic_compare

如,

struct Triple
{
    double values[3];
};

bool operator<( Triple const& a, Triple const& b )
{
    return std::lexicographic_compare(
        &a.values[0], &a.values[0] + 3,
        &b.values[0], &b.values[0] + 3
        );
}

void foo()
{
    vector<Triple> triples = ...;
    sort( triples.begin(), triples.end() );
}