2015-11-14 2 views
1

У меня есть некоторые элементы в элементе QMap<double, double> a. Теперь я хочу получить вектор некоторых значений a. Самый простой подход был бы (для меня):Получение части QMap в качестве QVector

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

с x1 и x0 как и с частыми остановками старт-позиции элементов, которые будут скопированы. Но есть ли более быстрый способ вместо этого для цикла?

Редактировать: С «более быстрым» я имею в виду как быстрее, так и (невозможно, как указано) более быстрое выполнение. Как было указано, values(i) работает не так, как ожидалось, поэтому я оставлю его здесь как псевдокод, пока не найду лучшую замену.

+0

Вы спрашиваете, есть ли более быстрый способ, но, глядя на ваш код, похоже, что он вообще не работает. 'QMap :: values ​​()' возвращает 'QList ', поэтому вы пытаетесь добавить 'QList' в качестве элемента вектора удвоений. Кроме того, вы на карте полны двойников, и все же вы используете целое число в качестве ключа. – dtech

+0

@ddriver: Заметил, спасибо! Я исправлю это, как только найду возможную замену. –

ответ

1

Может быть, это работает:

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

Идея заключается в том, чтобы получить все значения в виде списка double с, извлечь подсписок вы заинтересованы, таким образом, создать вектор из этого списка с помощью уже существующий статический метод QVector.

EDIT

Как было предложено в комментариях и в обновленном вопросе, то медленнее, чтобы набрать, но быстрее решение:

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

я предполагаю, что x0 и length заботиться о фактической длина ключевого списка, поэтому a.cbegin()+x0 действителен и не стоит добавлять охранника it != a.cend().

+0

Простой в использовании, но не очень эффективный, так как вся карта будет преобразована в список, тогда список будет обрезан и преобразован в вектор. Наиболее эффективным способом было бы перебрать диапазон карты и вывести результаты в вектор, который зарезервировал пространство для всех элементов. – dtech

+0

Абсолютно верно. Должен ли я оставить этот ответ здесь как возможное решение или вы предлагаете его удалить? – skypjack

+0

Все в порядке, вы можете добавить это решение к своему ответу и сделать его полным доказательством. Ведь ОП не указывает, что он означает «быстрее», быстрее набирать или быстрее выполнять. – dtech

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 

Это предполагает, что карта действительно достаточно элементов, таким образом, итератор не испытанные перед использованием.