2010-08-03 3 views
3

Это уже довольно лаконично, но было бы здорово, если бы я мог составить список a la Ruby. Скажем, у меня есть QStringListmyStringList, который содержит такие вещи, как «12.3», «-213.0», «9.24». Я хочу просто сопоставить все это с помощью toDouble без необходимости повтора. У Qt есть метод для этого?Могу ли я отображать списки в Qt?

// i.e. I would love a one-liner for the following 
// NB QT provices foreach 
QList<double> myDoubleList; 
foreach(QString s, myStringList) { 
    myDoubleList.append(s.toDouble()); 
} 

ответ

8

Насколько я могу сказать, контейнеры Qt имеют интерфейс совместим со стандартными контейнерами, так что вы должны быть в состоянии использовать стандартные алгоритмы на них. В этом случае, что-то вроде

std::transform(myStringList.begin(), 
       myStringList.end(), 
       std::back_inserter(myDoubleList), 
       std::mem_fun(&QString::toDouble)); 
+0

Да, контейнер Qt являются STL-совместимыми, так что все функционально-стиль вещей, которые вы можете сделать с STL контейнеров, которые можно сделать с контейнерами Qt, а также. Также посмотрите на boost :: bind(). Общий синтаксис, связанный с функциональным программированием STL plus, может вызвать тошноту для рубинов или хакеров-хакеров, хотя:) –

+1

Это не совсем функциональное программирование: вам пришлось объявить myDoubleList. Было бы неплохо преобразовать список одного типа в список другого и передать его функции, все в одной строке. И чтобы быть такой же мощной, как реальная функция отображения, в примере должен использоваться лямбда для окончательного аргумента для std :: transform. Но тогда синтаксис становится уродливым. – ecloud

0

общее решение является обертывание toDouble в преобразовании итератора. Грубо говоря:

class TransformIterator : public std::iterator<input_iterator_tag, double, ptrdiff_t, double*, double&> 
{ 
    StringList::const_iterator baseIter; 
public: 
    TransformIterator(StringList::const_iterator baseIter) : baseIter(baseIter) { } 
    TransformIterator operator++() { ++baseIter; return *this; } 
    double operator*() const { return baseIter->toDouble(); } 
}; 

QList<double> myDoubleList(TransformIterator(myStringList.begin()), 
          TransformIterator(myStringList.end())); 
Смежные вопросы