給定std::vector<std::vector<T>>
類(lèi)型的row-major表(其中T
是less-comparable類(lèi)型,如int
或std::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)型是給定的,不能更改/修改。
使用比較器比較要比較的元素。
完整工作示例: