首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >按子数组中的第一个元素对2d C++数组进行排序

按子数组中的第一个元素对2d C++数组进行排序
EN

Stack Overflow用户
提问于 2022-07-02 00:41:27
回答 2查看 69关注 0票数 2

我正在尝试按照第一个元素对c++子数组进行排序。我的代码目前设置如下:

代码语言:javascript
复制
int umbrellas[3][2] = {{5, 6}, {2, 7}, {9, 20}};

int n = sizeof(umbrellas) / sizeof(umbrellas[0]);

sort(umbrellas, umbrellas + n, greater<int>());

排序函数似乎不能正常工作,当我运行代码时,它会生成错误。是否有办法对数组进行排序

代码语言:javascript
复制
{{5, 6}, {2, 7}, {9, 20}}

转到

代码语言:javascript
复制
{{2, 7}, {5, 6}, {9, 20}}
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2022-07-02 08:52:13

使用std::vector of std::vector作为您的容器,这样排序就容易多了。std::vector不仅是C++的首选容器,而且在其上使用STL函数是非常简单和直接的,没有任何可证实的开销。

将数据定义为

代码语言:javascript
复制
std::vector<std::vector<int>> umbrellas{
    {5, 6},
    {2, 7},
    {9, 20}
};

现在,您可以使用自定义比较器lambda,它接受两个向量元素引用,并在上述向量的第一个元素小于下面的元素时返回True。

代码语言:javascript
复制
std::sort(umbrellas.begin(),
          umbrellas.end(),
          [](const std::vector<int> &above, const std::vector<int> &below)
          {
              return (above[0] < below[0]);
          });

以及产出:

代码语言:javascript
复制
for (auto &&row : umbrellas) {
    for (auto element : row) {
        std::cout<< element<< " ";
    }
    std::cout<< "\n";
}
代码语言:javascript
复制
2 7 
5 6 
9 20

把这个带到C++20上就更容易了:

代码语言:javascript
复制
std::ranges::sort(umbrellas, std::less(),
     [](const auto &v) { return v[0];});
票数 1
EN

Stack Overflow用户

发布于 2022-07-02 00:58:39

如果时间复杂度不重要,则该代码将实现O(n^2)复杂度所需的目标。

代码语言:javascript
复制
int arr[3][2] = {{5, 6}, {2, 7}, {9, 20}};

int n = sizeof(arr) / sizeof(arr[0]);

for(int i = 0 ; i < n - 1; i++){
    for(int j = 0 ; j < n - 1 ; j++){
        if(arr[j][0] > arr[j + 1][0])
            swap(arr[j],arr[j + 1]);
    }
}
票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/72835703

复制
相关文章

相似问题

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