C++在保留行內(nèi)容的同時(shí)按列排序表

給定std::vector<std::vector<T>>類(lèi)型的row-major表(其中T是less-comparable類(lèi)型,如intstd::string),我想按特定列對(duì)表進(jìn)行排序,同時(shí)保留行內(nèi)容(即一行只能作為一個(gè)整體移動(dòng),不能作為單個(gè)單元格移動(dòng))。

例如,給定此表:

2 8 1 4
3 7 6 7
3 3 4 9
8 6 3 4
7 1 5 7

按第三列(索引2)排序,預(yù)期結(jié)果為:

2 8 1 4
8 6 3 4
3 3 4 9
7 1 5 7
3 7 6 7

STL實(shí)現(xiàn)這一點(diǎn)的方法是什么?

我能想到的一個(gè)解決方案是將應(yīng)該排序的列復(fù)制到一個(gè)關(guān)聯(lián)容器中(例如std::unordered_map<T, std::size_t>,其中鍵是單元格值,值是行索引),然后按鍵對(duì)映射進(jìn)行排序(使用std::sort()),提取得到的行索引順序,并將其用于re-order原始表中的行。

然而,當(dāng)將此解決方案作為實(shí)際代碼編寫(xiě)時(shí),它似乎non-elegant并且相當(dāng)冗長(zhǎng)。

有什么可能的“好”解決方案來(lái)實(shí)現(xiàn)這一點(diǎn)?

注:std::vector<std::vector<T>>的表類(lèi)型是給定的,不能更改/修改。

? 最佳回答:

使用比較器比較要比較的元素。

std::vector<std::vector<T>> vec;
// add elements to vec
int idx = 2;
std::sort(vec.begin(), vec.end(), [idx](const std::vector<T>& a, const std::vector<T>& b) {
    return a.at(idx) < b.at(idx);
});

完整工作示例:

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

typedef int T;

int main() {
    std::vector<std::vector<T>> vec = {
        {2, 8, 1, 4},
        {3, 7, 6, 7},
        {3, 3, 4, 9},
        {8, 6, 3, 4},
        {7, 1, 5, 7}
    };
    int idx = 2;
    std::sort(vec.begin(), vec.end(), [idx](const std::vector<T>& a, const std::vector<T>& b) {
        return a.at(idx) < b.at(idx);
    });
    for (size_t i = 0; i < vec.size(); i++) {
        for (size_t j = 0; j < vec[i].size(); j++) {
            std::cout << vec[i][j] << (j + 1 < vec[i].size() ? ' ' : '\n');
        }
    }
    return 0;
}

公眾號(hào):1024技術(shù)圈

?? 提供互聯(lián)網(wǎng)知識(shí)和資訊,分享IT前沿技術(shù),熱門(mén)資源,大廠面試題 ??

主站蜘蛛池模板: 国产亚洲综合精品一区二区三区 | 色综合一区二区三区| 亚洲国产精品一区第二页| 波多野结衣免费一区视频| 国产欧美一区二区精品仙草咪 | 久久无码精品一区二区三区| 亚洲高清毛片一区二区| 久久高清一区二区三区| 538国产精品一区二区在线| 精品日本一区二区三区在线观看| 亚洲AV无码一区二区三区在线| 相泽南亚洲一区二区在线播放| 久久福利一区二区| 亚洲午夜精品一区二区公牛电影院 | 国产亚洲3p无码一区二区| 人妻无码久久一区二区三区免费| 国产免费一区二区视频| 色妞AV永久一区二区国产AV| 亚洲丰满熟女一区二区哦| 国产高清在线精品一区小说 | 亚洲午夜精品第一区二区8050| 国产亚洲一区区二区在线| 日韩精品中文字幕无码一区| 欧美日韩一区二区成人午夜电影 | 无码一区二区三区爆白浆| 亚洲国产高清在线精品一区| 高清一区高清二区视频| 一区二区三区杨幂在线观看| 亚洲欧美日韩国产精品一区| 精品国产日韩亚洲一区| 久久精品一区二区国产| 国模精品一区二区三区视频 | 四虎在线观看一区二区| 国产婷婷色一区二区三区深爱网 | 亚洲熟女少妇一区二区| 韩国一区二区视频| 日本强伦姧人妻一区二区| 久热国产精品视频一区二区三区| 国产aⅴ一区二区| 日韩精品电影一区亚洲| 精品视频一区二区三区在线观看|