首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何根据c++中某列的升序值交换矩阵中的行

如何根据c++中某列的升序值交换矩阵中的行
EN

Stack Overflow用户
提问于 2022-10-13 06:41:37
回答 1查看 31关注 0票数 0

我很难根据特定列的值在矩阵(嵌套数组)中交换行,我正在制作一个控制台应用程序,该应用程序显示足球世界杯小组赛的结果,所以我首先插入游戏结果以更新每队(行)的统计数据并生成输入数组,但最后,我需要根据每个队的点数(每行的最后位置)对行进行排序。我需要创建一个函数来生成输出数组。

输入数组:

代码语言:javascript
复制
inputArray[4][7] {

                  {0, 2, 1, 1, 3, -2, 2},
                  {1, 1, 1, 3, 3,  0, 4},
                  {2, 0, 1, 3, 1,  2, 6},
                  {1, 1, 1, 2, 2,  0, 4},
                }

函数的输出数组:

代码语言:javascript
复制
outputArray[4][7] {

                  {2, 0, 1, 3, 1,  2, 6},
                  {1, 1, 1, 3, 3,  0, 4},
                  {1, 1, 1, 2, 2,  0, 4},
                  {0, 2, 1, 1, 3, -2, 2},
                  
                }
EN

回答 1

Stack Overflow用户

发布于 2022-10-13 08:16:18

解决办法很简单。但我猜这不是你想要的。

而且,我认为行中的最后一个值不是和。。。

但让我们先看看一个潜在的解决方案:

代码语言:javascript
复制
#include <iostream>
#include <algorithm>
#include <array>

constexpr size_t NumberOfRows = 4u;
constexpr size_t NumberOfColumns = 7u;

using Columns = std::array<int, NumberOfColumns>;
using Array = std::array<Columns,NumberOfRows>;

int main() {
    Array array{{ {0, 2, 1, 1, 3, -2, 2},
                  {1, 1, 1, 3, 3,  0, 4},
                  {2, 0, 1, 3, 1,  2, 6},
                  {1, 1, 1, 2, 2,  0, 4} }};

    std::sort(std::begin(array), std::end(array), [](const Columns& c1, const Columns& c2) {return c1[6] < c2[6]; });

    for (const Columns& c : array) {
        for (const int i : c) std::cout << i << '\t';
        std::cout << '\n';
    }
}

如果希望数组是动态的,则可以使用std::vector。然后可以调整行数和列数。

代码语言:javascript
复制
#include <iostream>
#include <algorithm>
#include <vector>

constexpr size_t NumberOfRows = 4u;
constexpr size_t NumberOfColumns = 7u;

using Columns = std::vector<int>;
using Array = std::vector<Columns>;

int main() {
    Array array{  {0, 2, 1, 1, 3, -2, 2},
                  {1, 1, 1, 3, 3,  0, 4},
                  {2, 0, 1, 3, 1,  2, 6},
                  {1, 1, 1, 2, 2,  0, 4} };

    std::sort(std::begin(array), std::end(array), [](const Columns& c1, const Columns& c2) {return c1[6] < c2[6]; });

    for (const Columns& c : array) {
        for (const int i : c) std::cout << i << '\t';
        std::cout << '\n';
    }
}

但我仍然认为这是错误的设计。因为行中的最后一个值是其他值的总和。它是依赖的,可以计算,不需要存储ist。

请参阅下列更好的设计:

代码语言:javascript
复制
#include <iostream>
#include <algorithm>
#include <vector>
#include <numeric>

struct Result {
    std::vector<int> values{};
    int sum() const { return std::accumulate(values.begin(), values.end(), 0); }

    friend std::ostream& operator << (std::ostream& os, const Result& r) {
        for (const int i : r.values) os << i << '\t';
        return os << "--> " << r.sum();;
    }
};
struct Series {
    std::vector<Result> results{};
    friend std::ostream& operator << (std::ostream& os, const Series& s) {
        for (const Result r : s.results) os << r << '\n';
        return os;
    }
};
int main() {
    Series series{{     
        {{0, 2, 1, 1, 3,-2}},
        {{1, 1, 1, 3, 3, 0}},
        {{2, 0, 1, 3, 1, 2}},
        {{ 1, 1, 1, 2, 2, 0}}
    }};
    std::sort(series.results.begin(), series.results.end(), [](const Result& r1, const Result& r2) {return r1.sum() < r2.sum(); });

    std::cout << series;
}

但是你没有给出足够的信息来给出一个好的答案。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74051444

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档