【问题标题】:Getting a part of a QMap as a QVector将 QMap 的一部分作为 QVector
【发布时间】:2015-11-14 09:41:47
【问题描述】:

我在QMap<double, double> a-元素中有一些元素。现在我想得到一些a 值的向量。最简单的方法是(对我来说):

int length = x1-x0;
QVector<double> retVec;
for(int i = x0; i < length; i++)
{
    retVec.push_back(a.values(i));
}

使用x1x0 作为要复制的元素的停止位置和开始位置。但是有没有更快的方法来代替这个 for 循环?

编辑:对于“更快”,我的意思是 打字速度更快, (不可能,正如指出的那样)更快的执行。正如已经指出的那样,values(i) 没有按预期工作,因此我将把它作为伪代码留在这里,直到找到更好的替代品。

【问题讨论】:

  • 您询问是否有更快的方法,但查看您的代码,它看起来根本不起作用。 QMap::values() 返回 QList&lt;T&gt;,因此您尝试添加 QList 作为双精度向量的元素。此外,您的地图充满了双精度,但您使用整数作为键。
  • @ddriver:注意到了,谢谢!一旦找到可能的替代品,我会尽快修复它。

标签: qt qmap qvector


【解决方案1】:

也许这行得通:

QVector<double>::fromList(a.values().mid(x0, length));

想法是将所有值作为doubles 的列表获取,提取您感兴趣的子列表,从而通过QVector 已经存在的静态方法从该列表中创建一个向量。

编辑

正如 cmets 和更新后的问题中所建议的那样,它遵循打字速度较慢但速度更快的解决方案:

QVector<double> v{length};
auto it = a.cbegin()+x0;
for(auto last = it+length; it != last; it++) {
    v.push_back(it.value());
}

我假设x0length 负责密钥列表的实际长度,所以a.cbegin()+x0 是有效的,也不值得添加保护it != a.cend()

【讨论】:

  • 易于输入,但效率不高,因为整个地图将被转换为列表,然后列表将被裁剪并转换为矢量。最有效的方法是迭代地图的范围并将结果推送到为所有元素保留空间的向量中。
  • 完全正确。我应该把这个回复留在这里作为一个可能的解决方案还是你建议删除它?
  • 没关系,您也可以将该解决方案添加到您的答案中并使其充分证明。毕竟 OP 并没有具体说明他所说的“更快”、更快的输入或更快的执行是什么意思。
  • @ddriver:用必要的信息更新了我的问题
  • @arc_lupus - 你不能同时拥有。您可以快速键入,执行缓慢,或键入缓慢,快速执行。如果你经常使用它,只需为它编写一个函数,这样你就可以重用它并节省你自己的打字时间。
【解决方案2】:

试试这个,应该可以,还没有测试过:

int length = x1-x0;
QVector<double> retVec;
retVec.reserve(length); // reserve to avoid reallocations
QMap<double, double>::const_iterator i = map.constBegin();
i += x0; // increment to range start
while (length--) retVec << i++.value(); // add value to vector and advance iterator

这假设地图实际上有足够的元素,因此迭代器在使用前没有经过测试。

【讨论】:

    猜你喜欢
    • 2021-08-25
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多