【问题标题】:Sort two QVector对两个 QVector 排序
【发布时间】:2014-10-09 19:42:37
【问题描述】:

我有两个QVector<double>s xy。实际上,向量表示数据点 A(x[0], y[0]), B(x[1],y[1]) 等等。现在我想对x 进行排序并修改y 以便数据点仍然像A(x[n], y[n])。例如,如果我有 x{3,6,1,5} 和 y{9,2,1,5} 我应该收到:x{1,3,5,6} 和 y{1 ,9,5,2}。有什么算法吗?

【问题讨论】:

  • 我不知道 Qt 中有什么算法可以解决问题。是否可以创建一个将 x 和 y 结合在一起的结构?然后你可以实现它的比较运算符来比较 xs,这样这些结构的向量就可以传递给任何排序算法。否则恐怕你必须自己实现排序。
  • 我应该注意到性能非常重要。我的QVectors 长度为数千,因此不适合创建新的QVectorQMap 或其他容器。我会将数据点存储在QMap 中,但我需要将 x 值(和 y 值)存储在相邻的内存中。

标签: c++ algorithm qt


【解决方案1】:

您可以暂时合并向量(例如使用std::pair),然后进行排序(使用std::sort),最后再次将这些对拆分为两个向量。

【讨论】:

    【解决方案2】:

    您可以通过多种方式完成此操作,一种是使用中间映射容器并利用 <key,value> 对按键排序的事实:

    QVector<int> x = {2,1,0};
    QVector<int> y = {3,2,1};
    
    QMap<int, int> map;
    for(int i = 0; i < x.size(); ++i) // Assume vectors have the same size
         map.insert(x[i], y[i]);
    
    QList<int> xl = map.keys();
    QList<int> yl = map.values();
    
    x = QVector<int>::fromList(xl); // {0,1,2}
    y = QVector<int>::fromList(yl); // {1,2,3}
    

    【讨论】:

      【解决方案3】:

      据我所知,没有 Qt 函数可以满足您的需求。排序算法并不复杂,因此您必须编写自己的代码来实现它,并且只需要带有 y 向量标记,以便对 x 向量的任何操作在 y 向量上重复。我确定有人已经对此进行了编码,但它可能不会在您可以找到它的任何地方发布。也就是说,您当然可以找到执行排序的示例代码,然后添加到您的 y 向量部分。

      【讨论】:

        猜你喜欢
        • 2016-05-19
        • 2018-06-07
        • 1970-01-01
        • 2020-05-24
        • 1970-01-01
        • 2019-03-02
        • 2012-11-20
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多