【问题标题】:store array in vectors and sort the elements [closed]将数组存储在向量中并对元素进行排序[关闭]
【发布时间】:2014-04-21 17:07:54
【问题描述】:

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

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

这是一个输入示例:

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

对于预期的输出:

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

【问题讨论】:

  • std::vector<std::vector<int>> 也许?
  • - 234 567 234 - 234 123 678 - 234 123 465 - 567 890 123 .....说这些是输入。输出应该是 - 234 123 465 - 234 123 678 - 234 567 234 - 567 890 123 .....
  • 你自己试过什么代码?似乎是一个带有 std::sort 和自定义比较器的二维向量?
  • 对于排序,请参见例如std::sort.
  • std::vector<std::tuple<int, int, int>>。是的,有很多方法。你试过什么?

标签: c++ algorithm sorting vector


【解决方案1】:

你基本上需要一个二维整数向量,然后你可以使用 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< 已经存在用于比较向量。

操作 、= 的行为就像使用算法 lexicographical_compare 一样,该算法使用运算符

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

【讨论】:

  • 它是否适用于组合键的数量增加的情况,比如从三个到四个或五个......??组合键的数量是用户输入..
  • @user3314983:是的,事实上,它比元组更灵活。
  • 内部向量是否只存储一个整数值......??我无法理解..你能解释一下吗..
  • 请阅读std::vectorstd::sort
  • @Jarod42:好点,已更新。我使用了 myfunction,因为这也是手册使用的。 :) 我之前也在考虑 const 引用,但我的懒惰赢了。 :P
【解决方案2】:

定义合适的比较函数的一种简单方法是使用返回负数、零或正数的compare函数。例如。 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() );
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-02-24
    • 2022-12-29
    • 2016-07-26
    • 1970-01-01
    • 1970-01-01
    • 2016-01-10
    • 1970-01-01
    相关资源
    最近更新 更多