c++ - 根据一个 vector 对多个 vector 进行排序

标签 c++ sorting vector

我有四个 vector ,其中包含圆心的 x、y、半径和重量信息。我想按重量顺序对它们进行排序(从最高到最低),但我真的不知道如何或从哪里开始。我可以将所有 vector 放在 Eigen::Tensor 中如果有帮助的话,将收集的数据保存在一个 4d 矩阵中。但除此之外我不知道。

每个 vector 包含 134 个元素,但由于只有其中一个需要排序,这意味着排序算法并不那么重要。

有人知道从哪里开始吗?

最佳答案

您可以创建第 5 个索引 vector ,根据 4 个 vector 之一对索引 vector 进行排序,然后在 O(n) 时间内重新排序所有 4 个 vector (并对索引 vector 进行排序)。根据 3 个 vector 之一(年龄 vector )对 3 个 vector 进行排序的示例。创建索引 vector I,然后根据 A 进行排序(使用 lambda 比较),然后通过撤消 I 中的“循环”,根据 I 对所有 3 个 vector 和 I 重新排序。

#include <algorithm>
#include <iostream>
#include <iomanip>
#include <string>
#include <vector>

int main()
{
    std::vector <int> A;                // ages
    std::vector <std::string> N;        // names
    std::vector <int> Z;                // zip codes
    std::vector <size_t> I;             // indices
    int tA;
    std::string tN;
    int tZ;

    A.push_back(37);
    N.push_back("Ted");
    Z.push_back(54211);
    A.push_back(21);
    N.push_back("John");
    Z.push_back(53421);
    A.push_back(31);
    N.push_back("Fred");
    Z.push_back(52422);
    A.push_back(21);
    N.push_back("Sam");
    Z.push_back(51422);
    // display the vectors
    for(size_t i = 0; i < A.size(); i++)
        std::cout << std::setw(6) << N[i]
            << std::setw(8) << Z[i]
            << std::setw(4) << A[i] << std::endl;
    std::cout << std::endl;
    // initialize the vector of indices
    for(size_t i = 0; i < A.size(); i++)
        I.push_back(i);
    // sort I according to A
    std::stable_sort(I.begin(), I.end(),
        [&A](size_t i, size_t j) {return 
        A[i] < A[j];});
    // reorder A, N, Z in place also restore I
    // time complexity is O(n)
    for(size_t i = 0; i < A.size(); i++){
        size_t j, k;
        if(i != I[i]){
            tA = A[i];
            tN = N[i];
            tZ = Z[i];
            k = i;
            while(i != (j = I[k])){
                A[k] = A[j];
                N[k] = N[j];
                Z[k] = Z[j];
                I[k] = k;
                k = j;
            }
            A[k] = tA;
            N[k] = tN;
            Z[k] = tZ;
            I[k] = k;
        }
    }
    // display the sorted vectors
    for(size_t i = 0; i < A.size(); i++)
        std::cout << std::setw(6) << N[i]
            << std::setw(8) << Z[i]
            << std::setw(4) << A[i] << std::endl;
    return 0;
}

关于c++ - 根据一个 vector 对多个 vector 进行排序,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43788429/

相关文章:

linux - 排序命令中空格的处理。 LC_COLLATE=c 和 LC_COLLATE ="en_US.UTF-8"之间的区别

c++ - STL vector 是 realloc 的更好版本吗?

C++模板函数在 header 中编译但未在实现中编译

android - eclipse 中没有 std::find() 的匹配函数。在 XCode 中运行良好

c++ - 为什么 clock::is_steady 返回 const bool 而不是 bool?

javascript - 如何对一个JS数组进行批量排序(为了性能)

C++ 运行时成员函数按字符串名称访问

php - 在深度嵌套数组中查找特定键的最低值

c++ - std::vector 与 std::list 与 std::slist 的相对性能?

c++ 相同的代码从不在 Visual Studio 中编译/运行,有时在 Qt Creator 中编译/运行