我正在寻找一种有效的方法来进行条件插入.理想情况下,我想要一个适用于任何地图的模板功能.我想要这样的东西:
std::map<int, std::string> MyMap;
if(MyMap.ConditionalInsert(3, "Hello"))
{ // there was no element 3, one has been added with value "Hello"
}
else
{ // there was already an element 3 in the map, it's unchanged
}
Run Code Online (Sandbox Code Playgroud)
我不能轻易使用,operator[]
因为没有简单的方法来判断它是否创建了一个元素.我可以count
用于测试,但是如果我们进行插入,我必须搜索两次地图.我觉得有些东西find
会是最好的,但它似乎似乎总是吵得很尴尬.
有没有一个非常好的方法来做到这一点?
你对此有什么问题:
auto ret = MyMap.insert(std::make_pair(3, "Hello"));
if( ret.second)
{
//the value is inserted
}
else
{
//no value is inserted
}
Run Code Online (Sandbox Code Playgroud)
返回值指示值是否已存在.如果不存在,则插入值,否则不插入任何值.
取自这里:
...返回一对,其成员对:: first设置为迭代器,指向新插入的元素或指向已在地图中具有相同值的元素.如果插入新元素,则对中的pair :: second元素设置为true;如果存在具有相同值的元素,则设置为false.
std::map<T1,T2>::insert
已经对你进行了检查,如果已经有一个带有指定键的条目,则插入将被中止.
std::map<int, std::string> m;
m.insert (std::make_pair (3, "hello world"));
m.insert (std::make_pair (3, "world hello"));
std::cerr << m[3] << std::endl;
Run Code Online (Sandbox Code Playgroud)
输出:
hello world
Run Code Online (Sandbox Code Playgroud)
std::map<T1,T2>::insert
返回a std::pair<std::map<T1,T2>::iterator, bool>
,第二个值(pair.second
)将作为一个标志,表示是否插入了键/值对.
if ret.second == true: value was inserted
if ret.second == false: the key has already been set
Run Code Online (Sandbox Code Playgroud)
示例代码段:
std::cerr << m.insert (std::make_pair (1,1)).second << std::endl;
std::cerr << m.insert (std::make_pair (1,2)).second << std::endl;
Run Code Online (Sandbox Code Playgroud)
产量
1
0
Run Code Online (Sandbox Code Playgroud)
归档时间: |
|
查看次数: |
2460 次 |
最近记录: |