哈希表和容器中添加元素的方法

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);

### 如何在 C++ 中创建使用哈希表添加元素 在 C++ 中,`std::unordered_map` 是一种实现哈希表容器[^1]。它允许存储键值对,并通过键快速访问对应的值。以下是关于如何创建 `std::unordered_map` 并向其中添加元素的详细说明。 #### 创建 `std::unordered_map` `std::unordered_map` 提供了多种构造函数来初始化容器[^3]。最常用的构造方法是创建一个空的 `std::unordered_map` 或者通过初始化列表直接定义初始内容。 以下是一个简单的代码示例,展示如何创建 `std::unordered_map`: ```cpp #include <iostream> #include <unordered_map> #include <string> int main() { // 创建一个空的 unordered_map std::unordered_map<std::string, int> map1; // 使用初始化列表创建 unordered_map std::unordered_map<std::string, int> map2 = {{"apple", 1}, {"banana", 2}, {"cherry", 3}}; // 输出 map2 的内容 for (const auto& pair : map2) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` #### 向 `std::unordered_map` 添加元素 可以通过以下几种方式向 `std::unordered_map` 中添加元素: 1. **使用 `operator[]`**: 如果键不存在,则会插入一个新的键值对,值被初始化为默认值(例如整数类型为 0)。如果键已存在,则更新其对应的值。 ```cpp map1["orange"] = 4; // 插入新元素 map1["apple"] = 5; // 更新现有元素 ``` 2. **使用 `insert` 方法**: 这种方法不会覆盖已存在的键值对,而是返回一个指示插入是否成功的布尔值。 ```cpp map1.insert({"grape", 6}); // 插入新元素 bool success = map1.insert(std::make_pair("apple", 7)).second; // 不会覆盖已有键 ``` #### 示例:完整代码 以下是一个完整的示例,展示如何创建 `std::unordered_map` 并向其中添加元素: ```cpp #include <iostream> #include <unordered_map> #include <string> int main() { // 创建一个空的 unordered_map std::unordered_map<std::string, int> fruitMap; // 使用 operator[] 添加元素 fruitMap["apple"] = 1; fruitMap["banana"] = 2; // 使用 insert 方法添加元素 fruitMap.insert(std::make_pair("cherry", 3)); fruitMap.insert({"orange", 4}); // 输出所有元素 for (const auto& pair : fruitMap) { std::cout << pair.first << ": " << pair.second << std::endl; } return 0; } ``` 输出结果将是: ``` apple: 1 banana: 2 cherry: 3 orange: 4 ``` #### 注意事项 - 当使用 `operator[]` 时,若键不存在,会自动插入该键并将其值初始化为默认值。因此,这种方式适合需要修改或新增元素的场景。 - 使用 `insert` 方法时,若键已存在,则不会覆盖原有值,这有助于避免意外覆盖数据[^3]。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值