push_back v.s. emplace_back:
两者都是在容器末尾添加元素的方法,但是push_back会创建临时对象并进行拷贝构造,而emplace_back是直接构造
//push_back
std::vector<MyClass> vec1;
MyClass obj1("Object1", 1);//创建一个obj1对象
vec1.push_back(obj1); //进行拷贝构造
vec1.push_back(MyClass("Object2", 2)); //构造临时对象,然后移动构造
//emplace_back
std::vector<MyClass> vec2;
vec2.emplace_back("ObjectA", 10); // 直接在 vector 中构造
vec2.emplace_back("ObjectB", 20); // 直接在 vector 中构造
insert:
可用于unordered_map类型以及unordered_set类型的哈希表总,如果传入的键已存在,则插入失败,原有的键值对保留
std::unordered_map<std::string, int> myMap;
myMap.insert(std::make_pair("apple", 1));
std::pair<const std::string, int> item = {"banana", 2};
myMap.insert(item);
std::unordered_set<std::string> mySet;
mySet.insert("apple");
std::string fruit = "banana";
mySet.insert(fruit);
operator[] :
仅可用于unordered_map类型的哈希表中进行访问和插入
std::unordered_map<std::string, int> myMap;
myMap["apple"] = 1; // 插入 ("apple", 1)
myMap["apple"] = 10; // 修改 "apple" 对应的值为 10
int value = myMap["banana"]; // "banana" 不存在,插入 ("banana", 0) (int默认构造为0),然后 value = 0
emplace:
在容器管理的内存中就地构造元素
std::unordered_map<std::string, int> myMap;
myMap.emplace("apple", 1); // 直接用 "apple" 和 1 构造 pair
std::unordered_set<std::string> mySet;
mySet.emplace("apple"); // 直接用 "apple" 构造 std::string
emplace_hint:
hint
是一个迭代器,提示新元素可能适合插入的位置
std::unordered_set<std::string> mySet;
auto it_hint = mySet.end();//声明一个迭代器指向哈希表末尾
mySet.emplace_hint(it_hint, "cherry");//在哈西末尾添加"cherry"
std::unordered_map<std::string, int> myMap;
auto it_hint = myMap.end();
myMap.emplace_hint(it_hint, "cherry", 3);