4

これはすでにかなり簡潔ですが、Rubyでリストをマップできれば素晴らしいと思います。「12.3」、「-213.0」、「9.24」などを含むQStringList myStringListがあるとします。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());
}
4

2 に答える 2

11

私が知る限り、QT のコンテナーには標準コンテナーと互換性のあるインターフェイスがあるため、標準アルゴリズムを使用できるはずです。この場合、次のようなもの

std::transform(myStringList.begin(), 
               myStringList.end(), 
               std::back_inserter(myDoubleList),
               std::mem_fun(&QString::toDouble));
于 2010-08-03T11:48:39.137 に答える
1

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())); 
于 2010-08-04T08:23:30.293 に答える