获取 QMap 的一部分作为 QVector

Getting a part of a QMap as a QVector

我在 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 循环更快的方法呢?

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

也许这行得通:

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

想法是将所有值作为 doubles 的列表获取,提取您感兴趣的子列表,从而通过 [=] 的现有静态方法从该列表创建一个向量13=].

编辑

正如评论和更新后的问题中所建议的,它采用了一种输入速度较慢但速度较快的解决方案:

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() 还有。

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

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

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