有没有一个函数可以修改map的值并返回迭代器?

问题描述 投票:0回答:1

我想要的是在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

c++ stl
1个回答
0
投票

通过迭代器赋值不会使迭代器失效,如果插入失败,您可以使用它和

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;
}
© www.soinside.com 2019 - 2024. All rights reserved.