std::map<Key,T,Compare,Allocator>::try_emplace_C++中文网
| template <class... Args> |
(1) | (C++17 起) |
| template <class... Args> |
(2) | (C++17 起) |
| template <class... Args> |
(3) | (C++17 起) |
| template <class... Args> |
(4) | (C++17 起) |
1) 若容器中已存在等价于 k 的关键,则不做任何事。否则行为类似 emplace ,除了以 value_type(std::piecewise_construct, std::forward_as_tuple(k), std::forward_as_tuple(std::forward<Args>(args)...)) 构造元素
2) 若容器中已存在等价于 k 的关键,则不做任何事。否则行为类似 emplace ,除了以 value_type(std::piecewise_construct, std::forward_as_tuple(std::move(k)), std::forward_as_tuple(std::forward<Args>(args)...)) 构造元素
3) 若容器中已存在等价于 k 的关键,则不做任何事。否则行为类似 emplace_hint ,除了以 value_type(std::piecewise_construct, std::forward_as_tuple(k), std::forward_as_tuple(std::forward<Args>(args)...)) 构造元素
4) 若容器中已存在等价于 k 的关键,则不做任何事。否则行为类似 emplace_hint ,除了以 value_type(std::piecewise_construct, std::forward_as_tuple(std::move(k)), std::forward_as_tuple(std::forward<Args>(args)...)) 构造元素
没有迭代器或引用被非法化。
参数
| k | - | 用于查找和若找不到则插入的关键 |
| hint | - | 指向位置的迭代器,新元素将插入到其前 |
| args | - | 转发给元素构造函数的参数 |
返回值
复杂度
注意
不同于 insert 或 emplace ,若不发生插入,则这些函数不从右值参数移动,这令操纵 value 为仅移动类型的 map ,如 std::map<std::string, std::unique_ptr<foo>> 更为容易。另外, try_emplace 分离地处理关键和到 mapped_type 的参数,不同于要求参数构造 value_type (即一个 std::pair )的 emplace 。
示例
#include <iostream> #include <utility> #include <string> #include <map> int main() { using namespace std::literals; std::map<std::string, std::string> m; m.try_emplace("a", "a"s); m.try_emplace("b", "abcd"); m.try_emplace("c", 10, 'c'); m.try_emplace("c", "Won't be inserted"); for (const auto &p : m) { std::cout << p.first << " => " << p.second << '\n'; } }
输出:
a => a b => abcd c => cccccccccc