【问题标题】:unordered_map of iterators - how to check uninitialized elementsunordered_map of iterators - 如何检查未初始化的元素
【发布时间】:2012-11-23 02:52:01
【问题描述】:

我有一个 unordered_map<string, list<SomeClass>::iterator>

我想在这个地图中插入一个元素,但前提是它不存在。如果存在,我不想覆盖现有项目。另外,我想避免进行两次查找以检查项目是否存在,然后再进行插入。我得出的结论是我应该使用 operator[] 来获取一个带有键的元素,检查它是否有效,如果不是,则初始化它。问题是该元素是一个迭代器,我必须检查它是否已初始化,这实际上是不可能的。我可以使用从列表迭代器类派生的类,并实现默认构造函数以将其初始化为“无效”值,但在构造函数中我无权访问列表实例以获取其 end() 迭代器。 有什么想法吗?

【问题讨论】:

    标签: c++ stl iterator hashmap unordered-map


    【解决方案1】:

    使用insertemplace,如果该值已经存在,则不会覆盖该值:

    auto i = m.insert(std::make_pair("hello"), my_iterator);
    auto j = m.emplace("hello", my_iterator);                  // same
    

    你可以测试i.second看插入是否成功,i.first是map元素的迭代器。

    【讨论】:

    • 哈!称我为愚蠢,但我一直认为插入会覆盖值:)
    • @AlexanderVassilev 来自this reference for insert:“如果容器尚未包含具有等效键的元素,则将元素插入容器中。”
    猜你喜欢
    • 2013-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多