给出这张地图:
map<string,pair<mutex,set<string>>> m;
如果新元素还不存在,我想在键处插入新元素。 我可以使用运算符[]
执行此操作,即:
string possibly_new_key{"foo"};
m[possibly_new_key];
这将默认构造我的对
,这也是我想要的。 问题是,我的节目的表现是我首先关注的,也是最后关注的。 出于这个原因,我想使用map::insert
或map::emplace_hint
,并使用一个提示(无论如何,我必须事先计算)来“如果它不存在则插入”。 但是我不知道如何正确地调用这个函数,因为不管我怎么尝试,
我想要的(但不起作用):
auto it=m.lower_bound(possibly_new_key);
//do_stuff_with_it(it);
auto new_value=make_pair(mutex{},set<string>{});
m.emplace_hint(it, piecewise_construct, forward_as_tuple(possibly_new_key), forward_as_tuple(new_value));
有没有一种方法可以通过使用一个提示来实现这一点,或者只是默认构造新值,或者提供一个默认构造的值并移动它?
标准容器的所有元素必须是可复制的。 您可以将共享指针用作可复制元素:
struct MutexSetStr
{
std::mutex mutex;
std::set<std::string> data;
};
std::map< std::string, std::shared_ptr<MutexSetStr> > m;