2

QMap<double, double> a我在-element中有一些元素。现在我想得到一些值的向量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)它没有按预期工作,因此我将把它作为伪代码留在这里,直到找到更好的替代品。

4

2 回答 2

2

也许这有效:

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

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

编辑

正如评论和更新的问题中所建议的,它遵循一个输入速度较慢但速度更快的解决方案:

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()

于 2015-11-14T10:07:56.870 回答
0

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

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

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

于 2015-11-14T10:54:43.633 回答