关于 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< std::string, std::list<[container]::iterator> >
来索引/引用容器的元素?不过,必须小心不要使迭代器无效......
【参考方案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_back
s 期间,vector
调整大小不会使索引失效)。
如果这有什么不符合您要求的地方,请解释......
【讨论】:
酷!我不知道多图。看起来很有希望。让我检查一下,看看它是否会起作用。谢谢。以上是关于关于 C++11 中惰性索引向量的建议?的主要内容,如果未能解决你的问题,请参考以下文章