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

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

<think>我们被要求提供C++中哈希表添加删除元素的示例。C++标准库提供了`std::unordered_map``std::unordered_set`两种哈希表容器。 其中,`std::unordered_map`存储键值对,而`std::unordered_set`只存储键(值)。 根据用户需求,我们分别给出这两个容器添加删除操作示例。 注意:引用[1]中提到了使用`unordered_set`,引用[2][3]提供了C++标准库的相关信息,特别是引用[3]是关于STL容器的性能基准测试。 我们将分别展示: 1. 使用`std::unordered_map`添加删除元素。 2. 使用`std::unordered_set`添加删除元素。 步骤: 添加元素: - 对于`unordered_map`,可以使用`insert`方法或`operator[]`。 - 对于`unordered_set`,使用`insert`方法。 删除元素: - 两者都可以使用`erase`方法,可以通过键或迭代器来删除。 同时,我们也可以展示如何检查元素是否存在(因为删除前可能需要检查)。 示例代码将包括: - 包含必要的头文件 - 创建容器 - 添加元素 - 删除元素 - 遍历容器以查看内容 注意:由于用户要求示例,我们将提供完整的可运行代码片段,并加上注释。</think>以下是在 C++ 中使用哈希表(`std::unordered_map` `std::unordered_set`)进行添加删除操作的示例说明: --- ### 1. **使用 `std::unordered_map`(键值对哈希表)** ```cpp #include <iostream> #include <unordered_map> int main() { // 创建哈希表 std::unordered_map<std::string, int> scores; // 添加元素(三种方式) scores["Alice"] = 90; // 方式1:通过[]运算符 scores.insert({"Bob", 85}); // 方式2:insert() + 初始化列表 scores.emplace("Charlie", 95); // 方式3:emplace()(高效构造) // 删除元素(两种方式) scores.erase("Bob"); // 方式1:通过键名删除 auto it = scores.find("Alice"); if (it != scores.end()) { scores.erase(it); // 方式2:通过迭代器删除 } // 打印剩余内容 for (const auto& [name, score] : scores) { std::cout << name << ": " << score << std::endl; } // 输出: Charlie: 95 return 0; } ``` --- ### 2. **使用 `std::unordered_set`(唯一键集合)** ```cpp #include <iostream> #include <unordered_set> int main() { // 创建哈希集合 std::unordered_set<std::string> names; // 添加元素 names.insert("Alice"); names.insert("Bob"); names.emplace("Charlie"); // 高效构造 // 删除元素 names.erase("Bob"); // 通过键名删除 if (auto it = names.find("Alice"); it != names.end()) { names.erase(it); // 通过迭代器删除 } // 打印剩余内容 for (const auto& name : names) { std::cout << name << std::endl; } // 输出: Charlie return 0; } ``` --- ### 关键操作说明 | **操作** | **`unordered_map`** | **`unordered_set`** | |----------------|-----------------------------------------|----------------------------------| | **添加元素** | `map[key]=value;`<br>`map.insert({key,value});`<br>`map.emplace(key,value);` | `set.insert(value);`<br>`set.emplace(value);` | | **删除元素** | `map.erase(key);`<br>`map.erase(iterator);` | `set.erase(value);`<br>`set.erase(iterator);` | | **查找元素** | `map.find(key) != map.end()` | `set.find(value) != set.end()` | --- ### 性能说明 1. **添加/删除时间复杂度**:平均 $O(1)$,最坏情况 $O(n)$(哈希冲突严重时)[^3]。 2. **内存管理**:自动处理动态扩容,但可通过 `reserve()` 预分配空间优化性能。 3. **冲突处理**:C++ 标准库使用**链地址法**(Separate Chaining)解决冲突[^1]。 --- ### 相关问题 1. 如何避免哈希表操作中的常见错误(如迭代器失效)? 2. `std::unordered_map` `std::map` 在性能上有何区别?[^3] 3. 如何自定义哈希函数以优化特定数据类型的存储? [^1]: 引用自用户提供的哈希表实现挑战说明 [^3]: 引用自 C++ STL 容器性能基准测试数据
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值