【问题标题】:Is there in Qt built-in data strucutre that ignore duplicate insertion of item?Qt 内置数据结构中是否存在忽略重复插入项的数据结构?
【发布时间】:2016-05-13 04:06:56
【问题描述】:

我会使用QSet,但我需要保留插入项目的顺序,因为我需要稍后循环遍历该列表。

 QSet<QString> notes;
    notes << "a" << "b" << "c" << "a";
    foreach(const QString &note, notes)
        qDebug() << note;

将输出:

a
c
b

代替:

a
b
c

我知道我能做到:

if(!list.contains(item))
            list << item;

或者实现我自己的任何更好的方法。我只是想知道是否存在通常更快且经过良好测试的本机数据结构等...

【问题讨论】:

  • 如果不是here,并且没有更新的文档,没有。你在 STL 中也没有它。制作一个通用适配器来满足您的需求。
  • 根据您的需要(例如,内存使用与插入速度的重要性),您可以创建一个使用std::vector&lt;std::set&lt;std::string&gt;::iterator&gt;std::set&lt;std::string&gt; 的类。这使您可以快速检查它是否已包含并保留插入顺序,显然会产生一些存储开销。 (或等效的 Qt 类)
  • 如果您的集合足够小,您不妨使用列表方法。

标签: c++ list qt data-structures


【解决方案1】:

如果你想保持插入顺序避免重复,那么 Qt 中就没有现成的东西了。

一个简单的辅助函数就可以完成这项工作:

template <typename T>
bool appendUnique(QList<T> & data, QSet<T> & index, const T & value) {
  if (index.contains(value))
    return false;
  data.append(value);
  index.insert(value);
  return true;
}

【讨论】:

  • 基本上是我最后写的。谢谢
猜你喜欢
  • 1970-01-01
  • 2018-08-18
  • 1970-01-01
  • 2020-04-08
  • 1970-01-01
  • 2018-11-02
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多