每次找到一个我使用find
的元素,因此,我有一个指针返回它(迭代器更好地描述它而不是指针)。但是,如果元素不存在,我就去创建它。
问题是,在两种情况之后,我想要有一些东西指向该元素,无论它是否存在(因为我确保我创建它)。我的解决方案是使用find(第二次,我认为这是昂贵的),但我认为可以有一种统一的方式来保持对项目的引用而不进行第二次搜索(通过先前的查找或创建项)。
这可能吗?
答案 0 :(得分:3)
这是一种常见模式 - 您可以使用insert()
返回迭代器,无论是否添加了某些内容:
#include <iostream>
#include <unordered_map>
#include <string>
using namespace std;
int main()
{
std::unordered_map<int, string> m;
auto result = m.insert(std::make_pair(0, "Foo"));
if(result.second)
cout << "Inserted: " << result.first->first << " -> " << result.first->second << '\n';
result = m.insert(std::make_pair(0, "Bar"));
if(!result.second)
result.first->second = "Bar";
for(auto i : m)
cout << i.first << " -> " << i.second << '\n';
return 0;
}
输出:
Inserted: 0 -> Foo
0 -> Bar
答案 1 :(得分:2)
它的返回值是std::pair<iterator,bool>
,其中布尔值表示实际插入是否已发生或值是否已存在。请参阅文档了解返回值:
1-2)返回一个由插入元素的迭代器组成的对 (或阻止插入的元素)和bool表示 插入是否发生。