【问题标题】:C++ 2D vector sortingC++ 2D 向量排序
【发布时间】:2016-09-17 00:28:57
【问题描述】:

我想对二维向量 (10x100) 中的数字进行排序。

我的想法是先按行排序,然后在第一列中找到最小的数字并保存在一个新的一维向量中,然后删除列中最小的一个,以此类推直到最后一个数字。

我的代码是这样的,但它不起作用。

vector <vector <int> > vec(10, vector <int> (0));// already sorted by rows.
vector <int> datafinal;

for( int row=0; row < vec.size(); row++){
    int mini = vec[0][0];
    if (vec[row][0]< mini) {
        datafinal.push_back(mini);
        vec[row].erase(vec[row].begin());
    }
}

for (int k=0; k< datafinal.size(); k++){
    cout << datafinal[k] << endl;
}

【问题讨论】:

  • 您的逻辑似乎从根本上被打破了。由于同一行可能每次都具有最小值,因此最终该行将完全为空,而其余行保持不变。第一列将不再有“最小的”,因为根据定义,其中一行将为空,并且您的逻辑将导致未定义的行为。显示的代码也有一个明显的错误,但由于您的整体逻辑似乎很糟糕,这是一个有争议的问题。先弄清楚正确的逻辑,然后开始着手实现。
  • 你能告诉我一些逻辑吗?我只是一个初学者。
  • 不幸的是,只有您知道对矩阵进行排序所需的逻辑。我不知道您的矩阵是做什么用的,以及您打算如何使用它。尽管您可能是 C++ 的初学者,但这与 C++ 无关。如果在 C++、Java、Python、Perl 或任何其他语言中实现,逻辑将是相同的。首先,您需要用逻辑术语定义您需要如何对矩阵进行排序。然后才把它翻译成代码。
  • 你不需要对一行进行排序来获得一行中最小的项目。只需使用std::min_element(vec[row].begin(), vec[row].end()); 即可获得一个迭代器,指向一行中最小的项目row

标签: c++ sorting vector 2d


【解决方案1】:

根据您的问题和逻辑示例,我觉得这就是您正在尝试做的事情:

  • 您希望对整个矩阵/二维向量进行排序,以便从左到右和从上到下读取矩阵/二维向量将以升序/降序读取。

在这种情况下,您可以将整个矩阵/2d 向量视为一组用于排序的 N 个元素,但您必须确保以 2d 格式正确放置/替换数据。

这方面的一个例子是:

[3, 5, 1]
[1, 3, 1]
[12、4、1]

如果您将其表示为,则可以将其作为标准数组/向量处理:[3, 5, 1, 1, 3, 1, 12, 4, 1]

通过将其视为标准数组/向量,您可以对集合执行正常的排序功能。

然后将其转换回矩阵/2d 格式,您可以遍历该集合,并且每次您读取构成行 N 大小的元素数量时,您将移动到新行。

【讨论】:

  • 为什么?值的含义是什么?它是如何使用的?您是否只需要整个数组的最小值?还是每行/列的最小值都有什么意义?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-09-07
  • 1970-01-01
  • 2015-09-06
  • 1970-01-01
  • 2021-09-25
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多