我使用具有QString属性名称的对象母亲的QList。我想从只有母亲名字的母亲那里创建另一份名单。 这可能是这样的:
QList<QString> names;
for(int i=0; i<mothers.length<i++0{
names[i] = mothers[i].name;
}
但我想知道我是否可以做一些更高效的事情。
答案 0 :(得分:1)
从根本上说,您需要迭代一个列表并将名称提取到第二个列表中,这是不可避免的。通过使用库方法或类似的方法来隐藏循环可能会使它看起来更整洁,但这些方法仍然需要迭代它。
所以不,没有更有效的方法。虽然,有可能有更整洁的方式。
答案 1 :(得分:1)
如果确实需要一个包含所有名称副本的独立列表,那么您所做的几乎是正确的,除了您应该在目标列表中保留存储,并使用range-for构造:
QList<Mother> mothers;
...
QStringList names;
names.reserve(mothers.size());
// C++11
for (auto const & mother : mothers) names << mother.name;
对于C ++ 98,你可以依靠:
for (QList<Mother>::const_iterator it = mothers.begin(); it != mothers.end(); ++it)
names << it->name;
不要试图使用Q_FOREACH
或foreach
,因为那些人坚持在每次迭代时复制整个Mother
对象。 C ++ 11 range-for更加实用。
但是,你可能不需要那个独立的列表。也许您需要的是一对可用于检查集合的迭代器。你可以为它做一些迭代器适配器。