Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/qt/6.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ STL还是Qt容器?_C++_Qt_Stl - Fatal编程技术网

C++ STL还是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

使用Qt容器(
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的容器:

  • 提供与
    QString
    中相同的COW实现,这在使用Qt的
    foreach
    宏时非常有用 当使用元类型、信号和插槽时
  • 可以使用STL风格的迭代器或Java风格的迭代器
  • 可使用
    QDataStream
  • 在Qt的API中广泛使用
  • 具有跨操作系统的稳定实现。STL实现必须遵守C++标准,但 在其他方面可以自由地做它喜欢做的事情(参见
    std::string
    COW)。一些STL实现特别复杂 糟糕
  • 提供哈希,除非使用TR1,否则哈希不可用
QTL与J.Blanchette的STL有着不同的理念:“STL的容器针对原始速度进行了优化,而Qt的容器类经过精心设计,以提供方便、最小的内存使用和最小的代码扩展。”

上面的链接提供了有关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.