我根据排序列表的索引对数据元素进行排序。当我需要对数据进行第二次或第三次排序时,我每次都需要将数据的原始顺序重新排序。如何再次访问以原始顺序存储的值?
decltype(m_data) new_m_datalast;
vector<int> m_newOrder;
for(int i=0; i< (int) m_data.size(); ++i)
new_m_datalast.push_back(std::move(m_data[m_newOrder[i]]));
m_data = new_m_datalast;
Run Code Online (Sandbox Code Playgroud)
更新
void Canvas::SetSortedOrder(std::vector<int> idxs)
{
m_newAxesOrder.clear();
m_newAxesOrder = idxs;
m_minmaxdata.clear();
QString filename(":/simdata/minmax.csv");
m_minmax = ReadCSV(filename);
decltype(m_data) new_m_data;
decltype(m_minmaxdata) new_m_minmaxdata;
for(int i=0; i< (int) m_data.size(); ++i)
new_m_data.push_back(std::move(m_data[m_newAxesOrder[i]]));
for(int i=0; i< (int) m_minmaxdata.size(); ++i)
new_m_minmax.push_back(std::move(m_minmax[m_newAxesOrder[i]]));
m_data = new_m_data;
m_minmax = new_m_minmax;
}
Run Code Online (Sandbox Code Playgroud)
如果您需要多次排序并稍后访问原始数据,我建议您使用tag sort。这是一个小的 C++ 示例:
template<typename T>
std::vector<size_t> tag_sort(const std::vector<T>& arr) {
std::vector<size_t> tag(arr.size());
std::iota(tag.begin(), tag.end(), 1);
std::sort(tag.begin(), tag.end(), [&arr](auto a, auto b) { return arr[a] < arr[b]; });
return tag;
}
int main() {
std::vector<int> arr = {5, 7, 2, 5, 9, 6, 1};
auto tag = tag_sort(arr);
for (auto v : tag)
std::cout << v << " ";
std::cout << "\nsorted data:\n";
for (auto v : tag)
std::cout << arr[v];
std::cout << "\n";
}
Run Code Online (Sandbox Code Playgroud)
如您所见,您可以访问 中的原始数据arr,并使用tagvector 来使用排序数据。
标签排序主要用于通过移动/复制切换元素非常昂贵的情况。但我认为这也是解决您问题的好方法。