C++ STL还是Qt容器?
使用Qt容器(C++ STL还是Qt容器?,c++,qt,stl,C++,Qt,Stl,使用Qt容器(QMap,QVector,等等)相对于其STL等价物的优缺点是什么 我可以看出选择Qt的一个原因: Qt容器可以传递到Qt的其他部分。例如,它们可以用来填充QVariant和QSettings(尽管有一些限制,但只接受键为字符串的QList和QMap/QHash) 还有别的吗 Edit:假设应用程序已经依赖Qt。Qt容器使用“写时拷贝”的习惯用法。我的五美分: Qt容器应该在不同的平台上工作相似。 而STL容器依赖于STL实现。 您可能会得到不同的性能结果 编辑: 我不是说ST
QMap
,QVector
,等等)相对于其STL等价物的优缺点是什么
我可以看出选择Qt的一个原因:
- Qt容器可以传递到Qt的其他部分。例如,它们可以用来填充
和QVariant
(尽管有一些限制,但只接受键为字符串的QSettings
和QList
/QMap
)QHash
Edit:假设应用程序已经依赖Qt。Qt容器使用“写时拷贝”的习惯用法。我的五美分: Qt容器应该在不同的平台上工作相似。 而STL容器依赖于STL实现。 您可能会得到不同的性能结果 编辑: 我不是说STL“慢”,而是指 各种实施细节。
请检查一下,然后也许。
这不是STL的真正问题。显然,如果在性能上存在显著差异,那么使用STL的代码中就存在问题。这是一个很难回答的问题。它实际上可以归结为一种哲学/主观的论点 话虽如此 我推荐“入乡随俗”的规则
这意味着如果你在Qt的土地,代码作为Qt'ians做。这不仅仅是为了可读性/一致性。考虑如果将所有东西存储在STL容器中,那么必须将所有数据传递给Qt函数,会发生什么。您真的想管理一堆将内容复制到Qt容器中或从Qt容器中复制出来的代码吗。您的代码已经严重依赖于Qt,所以您并没有通过使用stl容器使其变得更“标准”。如果每次你想用它做任何有用的事情,你都必须把它复制到相应的Qt容器中,那么容器有什么意义呢?除了COW的不同,STL容器在各种平台上得到了更广泛的支持。如果您将工作限制在“主流”平台上,那么Qt的可移植性就足够了,但是STL也可以在许多其他更模糊的平台上使用(例如,德克萨斯仪器公司的DSP) 因为STL是标准的,而不是由一家公司控制的,所以一般来说,与Qt相比,有更多的程序员可以轻松阅读、理解和修改STL代码,并有更多的资源(书籍、在线论坛、会议等)支持他们这样做。这并不是说仅仅因为这个原因就应该回避Qt;只是,在所有其他条件相同的情况下,您应该默认使用STL,但当然,所有条件都很少相同,因此您必须在自己的上下文中做出最有意义的决定
关于AlexKR的回答:STL性能在一定范围内得到保证,但给定的实现可能会利用依赖于平台的细节来加速STL。因此,从这个意义上讲,您可能会在不同的平台上得到不同的结果,但它永远不会比显式保证(模错误)慢。我开始使用
std:(w)string
和STL容器,并将其转换为Qt等价物,但是我已经切换到QString
,我发现我越来越多地使用Qt的容器
对于字符串,QString
提供了比std::basic_string
更完整的功能
完全了解Unicode。它还提供了一个我非常依赖的解决方案
Qt的容器:
- 提供与
中相同的COW实现,这在使用Qt的QString
宏时非常有用 当使用元类型、信号和插槽时foreach
- 可以使用STL风格的迭代器或Java风格的迭代器
- 可使用
QDataStream
- 在Qt的API中广泛使用
- 具有跨操作系统的稳定实现。STL实现必须遵守C++标准,但
在其他方面可以自由地做它喜欢做的事情(参见
COW)。一些STL实现特别复杂 糟糕std::string
- 提供哈希,除非使用TR1,否则哈希不可用
上面的链接提供了有关QTL实现和使用哪些优化的更多详细信息。主要问题之一是Qt的API希望您在Qt的容器中提供数据,因此您可以简单地使用Qt容器,而不是在两者之间来回转换
另外,如果您已经在使用Qt容器,那么最好只使用它们,因为您不必在STL库中包含STL头文件和潜在的链接。但是,根据您的工具链,这种情况无论如何都可能发生。纯粹从设计的角度来看,一致性通常是一件好事。我想这取决于您使用Qt的方式。如果你在你的产品中使用它,那么使用Qt容器可能是有意义的。如果只包含(例如)UI部分,则最好使用C++标准容器。 STL容器:
- 有性能保证吗
- 可用于STL算法,该算法也有性能保证
- 可以通过Boost 的第三方C++库来利用
- 是标准的,并且可能比专有解决方案更有效
- 鼓励对算法和数据结构进行通用编程。如果您编写符合STL的新算法和数据结构,您可以免费利用STL已经提供的功能
- 我是
QListIterator<QString> i(list);
while (i.hasNext())
qDebug() << i.next();
QList<QString>::iterator i;
for (i = list.begin(); i != list.end(); ++i)
qDebug << *i;
for( auto i = list.begin(); i != list.end(); ++i)
qDebug << *i;
for (QString i : list)
qDebug << i;
BOOST_FOREACH(QString i, list)
{
qDebug << i;
}
QVector<int> a, b;
a.resize(100000); // make a big vector filled with 0.
QVector<int>::iterator i = a.begin();
// WRONG way of using the iterator i:
b = a;
/*
Now we should be careful with iterator i since it will point to shared data
If we do *i = 4 then we would change the shared instance (both vectors)
The behavior differs from STL containers. Avoid doing such things in Qt.
*/
b.clear(); // Now the iterator i is completely invalid.