排序向量后访问值

Cec*_*ece 1 c++ sorting

我根据排序列表的索引对数据元素进行排序。当我需要对数据进行第二次或第三次排序时,我每次都需要将数据的原始顺序重新排序。如何再次访问以原始顺序存储的值?

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)

Afs*_*hin 5

如果您需要多次排序并稍后访问原始数据,我建议您使用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 来使用排序数据。

标签排序主要用于通过移动/复制切换元素非常昂贵的情况。但我认为这也是解决您问题的好方法。