关于 C++11 中惰性索引向量的建议?

Posted

技术标签:

【中文标题】关于 C++11 中惰性索引向量的建议?【英文标题】:Suggestions on a lazy indexed vector in C++11? 【发布时间】:2015-02-05 04:52:47 【问题描述】:

我正在处理很多对象,其中许多对象都有子对象数组。其中一些可能有数百万个项目,在特定操作期间,我需要通过名称访问这些项目。

但是,与此同时,我需要保持较低的性能和内存消耗。所以我的想法是创建一个复合模板类,类似于:

template <typename T>
class IndexedList 
public:
    std::vector<std::shared_ptr<T>> items;
    std::unordered_map<std::string, std::shared_ptr<T>> index;
    void build_index();
;

对于项目名称唯一的列表,这是可以的,但我正在努力的是如何处理名称不唯一的列表。我不能真正使用地图,我宁愿不迭代集合。

另一点是我必须在某些情况下以相同的顺序取回物品,而在另一种情况下以排序的顺序取回物品。

那么,挑战是可以用一个模板来完成吗?我宁愿不必在编译时决定使用哪种方法。理想情况下,像 SmartList 之类的东西,一旦加载项目列表就会延迟索引,并在运行时根据名称搜索开始时的加载模式决定是否应该使用 map 或 unordered_map(或 set)。它还应该处理多个键值,如果在加载向量期间遇到多个值。

有人有这样的野兽吗?

【问题讨论】:

不是答案,而是需要考虑的问题 - 如果您想通过名称而不是索引来处理它们,当名称相同时,您希望如何找到您正在寻找的实际对象?抛出异常并强制按索引查找?返回具有给定名称的所有可能元素?只有强制执行唯一性时,查找键才能完美工作。 这里废话太多了。您主要需要通过什么访问?有时还叫名字? 也许您可以将项目保留在当前容器中,而是使用std::map&lt; std::string, std::list&lt;[container]::iterator&gt; &gt; 来索引/引用容器的元素?不过,必须小心不要使迭代器无效...... 【参考方案1】:

也许……

template <typename T>
class IndexedList

  public:
    std::vector<T> items;
    std::multimap<std::string, std::vector<T>::size_type> index;
    void build_index();
;

...其中mutlimap 可以容忍重复的string 键,并将索引存储在vector 中(在push_back/emplace_backs 期间,vector 调整大小不会使索引失效)。

如果这有什么不符合您要求的地方,请解释......

【讨论】:

酷!我不知道多图。看起来很有希望。让我检查一下,看看它是否会起作用。谢谢。

以上是关于关于 C++11 中惰性索引向量的建议?的主要内容,如果未能解决你的问题,请参考以下文章

分段错误:从二维向量中随机删除元素

c++11 函数调用中的向量初始化

如何通过C ++中的数据获得向量的索引

如何使用 C++11 可变参数模板来定义由向量元组支持的元组向量?

带有智能指针的 C++11 向量

根据索引向量重新排序向量 - 更新