我想要的是在map
中插入一个pair(如果不存在则创建它,否则修改它),并获取值的指针,以供其他人使用。
这是一个演示代码:
#include <map>
using namespace std;
std::map<int, int> a = {{1, 1}};
int* set_and_return_value() {
// option 1: a[1] = 2; return &(a[1]); i think it's ugly
const auto [it, ok] = a.emplace(1, 2);
return &(it->second);
// emplace is good, but it won't modify the existed key's value
}
那么,有没有一个函数,可以在真正插入pair后返回
iterator
?
通过迭代器赋值不会使迭代器失效,如果插入失败,您可以使用它和
emplace
的返回值进行条件赋值:
#include <map>
using namespace std;
std::map<int, int> a = {{1, 1}};
auto set_and_return_it() {
const auto [it, inserted] = a.emplace(1, 2);
if (!inserted) {
it->second = 2;
}
return it;
}
如果您希望它更通用,请使用
try_emplace
以避免构造 2
两次。
template<typename K, typename T>
auto set_and_return_it(K&& key, T&& value) {
const auto [it, inserted] = a.try_emplace(std::forward<K>(key), std::forward<T>(value));
if (!inserted) {
it->second = std::forward<T>(value);
}
return it;
}