簡體   English   中英

在 C++ 中按單個元素對多維數組進行排序

[英]Sorting multidimensional arrays by individual elements in c++

我只是要出來問問。 我有 500 個數組 [127]。 我需要按最后一個元素的值按降序對它們進行排序。 您將如何以最有效的方式做到這一點?

EXAMPLE:

float arr1[] = {3,1,4,5};
float arr2[] = {1,2,5,8};
float arr3[] = {102,4,132,2};

OUTPUT:
{arr2,
arr1,
arr3}

您可以創建一個輕量級包裝器,它只存儲數組的beginend迭代器。

#include <iterator>

template<class T>
struct span {
    template<size_t N>
    span(T (&arr)[N]) : m_begin(std::begin(arr)), m_end(std::end(arr)) {}
    
    T* begin() const { return m_begin; }
    T* end() const { return m_end; }

    T& front() const { return *m_begin; }
    T& back() const { return *std::prev(m_end); }

private:
    T* m_begin;
    T* m_end;
};

然后,您可以將這些輕量級包裝器放入std::vector<span<int>>並對其進行排序。 請注意,這不會以任何方式影響原始數組,並且由於對向量進行排序只會移動span而不是實際的數組數據,因此它應該相當快。

#include <algorithm>
#include <iostream>
#include <vector>

int main() {
    int arr1[] = {3,1,4,5};
    int arr2[] = {1,2,5,8};
    int arr3[] = {102,4,132,2};

    std::vector<span<int>> arrs{
        arr1, arr2, arr3
    };

    // sort on the last element, decending:
    std::sort(arrs.begin(), arrs.end(),[](const auto& lhs, const auto& rhs) {
        return rhs.back() < lhs.back();
    });

    for(auto& arr : arrs) {
        for(auto v : arr) std::cout << v << ' ';
        std::cout << '\n';
    }
}

輸出:

1 2 5 8 
3 1 4 5 
102 4 132 2 

由於原始數組是沒有執行大小信息的指針,因此您的工作不是自動的。

要么將所有數組轉換為std::vector<float>以便擁有最后一個元素,然后使用自定義排序運算符測試std::vector<std::vector<float>> ,要么創建一個包含原始數組以及大小信息的結構。

std::vector<float> arr1 = {3,1,4,5}
std::vector<float> arr2 = {1,2,5,8}; 
std::vector<float> arr3 = {102,4,132,2};
std::vector<std::vector<float>> arrays = {arr1,arr2,arr3};

std::sort(arrays.begin(),arrays.end(),[](const std::vector<float>& r1,const std::vector<float>& r2) -> bool
{
   if (r1[r1.size() - 1] < r2[r2.size() - 1]) return true;
   return false;
});


struct ArrAndSize { float* arr; size_t sz; };

ArrAndSize arr1 = {{3,1,4,5},4};
ArrAndSize arr2 = {{1,2,5,8},4}; 
ArrAndSize arr3 = {{102,4,132,2},4};
std::vector<ArrAndSize> arrays = {arr1,arr2,arr3};

std::sort(arrays.begin(),arrays.end(),[](const ArrAndSize& r1,const ArrAndSize& r2) -> bool
{
   if (r1.arr[r1.sz - 1] < r2.arr[r2.sz - 1]) return true;
   return false;
});

在這兩種情況下,檢查數組的大小是否為 0。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM