首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> C語言 >> C++ >> 關於C++

C++ vector 排序並保留原始索引

     編輯:關於C++

問題

std::sort 僅返回排序後的值,丟失原始下標。需同時獲得排序後的值及其原始位置。

解決方案:鍵值對 + 自定義比較

構造 vector<pair<int, T>>,first 存原始索引,second 存值。按 second 排序,結果 first 即為原始索引序列。

通用模板函數

template <typename T>
void sortWithIndex(const vector<T>& values, vector<int>& indices) {
    indices.clear();
    vector<pair<int, T>> vp;
    vp.reserve(values.size());
    for (size_t i = 0; i < values.size(); ++i)
        vp.emplace_back(i, values[i]);

    sort(vp.begin(), vp.end(),
         [](const pair<int, T>& a, const pair<int, T>& b) {
             return a.second > b.second; // 降序;升序改為 <
         });

    indices.resize(vp.size());
    for (size_t i = 0; i < vp.size(); ++i)
        indices[i] = vp[i].first;
}

使用示例

int main() {
    vector<float> a = {1.0, 2.0, 4.0, 3.0};
    vector<int> idx;
    sortWithIndex(a, idx);
    // idx = {2, 3, 1, 0} 對應值 {4, 3, 2, 1}
    for (int i : idx) cout << i << ' '; // 輸出原始索引
    return 0;
}

變體:降序/升序、稳定排序

  • 比較函數改為 a.second < b.second 為升序
  • 需穩定排序用 stable_sort(相等值保持原序)
  • C++20 可用 std::views::enumerate 簡化

複雜度

  • 時間:O(n log n),同標準排序
  • 空間:O(n) 額外存儲 pair 向量
  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved