Могу ли я отобразить списки в Qt? - PullRequest
3 голосов
/ 03 августа 2010

Это уже довольно лаконично, но было бы замечательно, если бы я мог составить список в стиле Ruby. Скажем, у меня есть QStringList myStringList , который содержит такие вещи, как "12.3", "-213.0", "9.24". Я хочу просто отобразить все это, используя toDouble без повторов. Есть ли у 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());
}

Ответы [ 2 ]

9 голосов
/ 03 августа 2010

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

std::transform(myStringList.begin(), 
               myStringList.end(), 
               std::back_inserter(myDoubleList),
               std::mem_fun(&QString::toDouble));
0 голосов
/ 04 августа 2010

Распространенным решением является перенос 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())); 
...