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(相等值保持原序)std::views::enumerate 簡化