簡體   English   中英

C ++在向量的向量中對多列進行排序

[英]C++ Sorting multiple columns in a vector of vectors

我正在嘗試使用嵌套向量對多列進行排序,但不確定如何實際執行。 我在這里搜索了一堆帖子,但它們僅顯示如何對最多兩列進行排序,而我知道對一列進行排序如下:

sort(myVector.begin(), myVector.end(), [](vector<int> const a, vector<int> const b){return a[0] < b[0];});

我有一個輸入,用戶輸入向量的大小,向量會相應地生成,我希望能夠對輸出的每一列進行排序。

例如:

未分類

{3, 7, 2}

{9, 6, 8}

{5, 1, 4}

已排序

{3, 1, 2}

{5, 6, 4}

{9, 7, 8}

這是線性代數庫中的經典之作:由於元素訪問的模式,給定矩陣的布局會極大地影響性能。

您面臨完全相同的結果。 顯然,在您的情況下,每個int向量都是一行。 您需要對列進行排序。 您可以做的是移調把戲:

  1. 計算矩陣的轉置
  2. 對轉置的行進行排序
  3. 計算此排序矩陣的轉置
  4. 利潤

一些代碼來說明這個想法:

std::vector<std::vector<int>> transpose(std::vector<std::vector<int>> const& input) {
    // For simplicity, I assume input is well formed, i.e.:
    //  - All int vectors have the same size
    //  - input is non-empty.
    std::vector<std::vector<int>> tr_input;
    for(std::size_t i = 0; i < input.front().size(); ++i) {
        std::vector<int> tmp;
        for (auto& vec : input) {
            tmp.push_back(vec.at(i));
        }
        tr_input.push_back(tmp);
    }
    return tr_input;
}

現在我們有了轉置功能,我們可以實現算法了。

std::vector<std::vector<int>> input = { { 3, 7, 2 },
                                        { 9, 6, 8 },
                                        { 5, 1, 4 } };
auto tr = transpose(input);
for (auto& v : tr) {
    std::sort(v.begin(), v.end());
}
auto sorted = transpose(tr);

可以在此現場演示中查看結果

暫無
暫無

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

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