【C++】-- STL之unordered_map/unordered_set详解(二)

简介: 【C++】-- STL之unordered_map/unordered_set详解

6.元素修改

(1)insert( )

1. pair<iterator,bool> insert ( const value_type& val );//插入元素,成功返回的pair的第二个元素为true,失败则为false
2. iterator insert ( const_iterator hint, const value_type& val );//返回插入元素的位置
3. template <class InputIterator>
4. void insert ( InputIterator first, InputIterator last );//插入一段区间
5. void insert ( initializer_list<value_type> il );//将列表作为元素插入容器中

①插入元素

1.  cout << us2.insert(568).second << endl;//不存在,插入成功
2.  cout << us2.insert(291).second << endl;//已存在,插入失败

 

②返回插入元素的位置

cout << *us2.insert(us3.begin(), 65) << endl;

③ 插入一段区间

1.     unordered_set<int> us2;
2.  us2.insert(us1.begin(), us1.end());
3.  unordered_set<int>::iterator it = us2.begin();
4.  while (it != us2.end())
5.  {
6.    cout << *it << " ";
7.    it++;
8.  }
9.  cout << endl;

 

④将列表作为元素插入容器中

1.  unordered_set<string> us4;
2.  us4.insert({ "int", "string", "float" });
3.  unordered_set<string>::iterator it = us4.begin();
4.  while (it != us4.end())
5.  {
6.    cout << *it << " ";
7.    it++;
8.  }
9.  cout << endl;

(2)erase( )

删除元素:

1. iterator erase ( const_iterator position );//删除position位置的元素,并返回删除元素的位置
2. size_type erase ( const key_type& k );//返回删除值为k的元素的个数
3. iterator erase ( const_iterator first, const_iterator last );//删除从first到last区间的元素,并返回删除的last元素的位置

①删除position位置的元素,并返回删除元素的位置

1.  unordered_set<int> us2;
2.  us2.insert(us1.begin(), us1.end());
3.  cout << *us2.erase(us2.find(6)) << endl;

② 删除值为k的元素的,k存在返回1,k不存在返回0

cout << us2.erase(72) << endl;

③ 删除从first到last区间的元素,并返回删除的last元素的位置

cout << *us2.erase(us2.find(6), us2.find(291)) << endl;

(3)clear( )

删除容器中所有元素

void clear() noexcept;

清空us2中所有元素:

us2.clear();

(4)swap( )

交换两个同类型容器中的元素

1. unordered_set<int> us1;
2.  us1.insert(2);
3.  us1.insert(72);
4.  us1.insert(6);
5.  us1.insert(35);
6.  us1.insert(291);
7.  us1.insert(327);
8. 
9.  unordered_set<int> us5;
10.   us5.insert(56);
11.   us5.insert(57);
12.   us5.insert(58);
13.   us5.insert(59);
14.   us5.insert(60);
15.   us5.insert(61);
16. 
17.   us1.swap(us5);
18. 
19.   unordered_set<int>::iterator it1 = us1.begin();
20.   while (it1 != us1.end())
21.   {
22.     cout << *it1 << " ";
23.     it1++;
24.   }
25.   cout << endl;
26. 
27.   unordered_set<int>::iterator it5 = us5.begin();
28.   while (it5 != us5.end())
29.   {
30.     cout << *it5 << " ";
31.     it5++;
32.   }
33.   cout << endl;

哈系桶和哈希策略的函数等介绍完哈希表之后才能理解。

三、 unordered_map

1.特点

(1)unordered_map是存储<key, value>键值对的关联式容器,允许通过key快速的索引到与其对应的value。

(2)在unordered_map中,键值通常用于惟一地标识元素,而映射value是一个对象,其内容与key关联。键和映射值的类型可能不同。

(3)unordered_map没有对<kye, value>按照任何特定的顺序排序, 为了能在常数范围内找到key所对应的value,unordered_map将相同哈希值的键值对放在相同的桶中。

(4)unordered_map容器通过key访问单个元素要比map快,但它通常在遍历元素子集的范围迭代方面效率较低。

(5)unordered_map实现了直接访问操作符(operator[]),它允许使用key作为参数直接访问value。

(6)容器中的迭代器至少有正向迭代器。

2.构造  

1. explicit unordered_map ( size_type n = /* see below */,
2. const hasher& hf = hasher(),
3. const key_equal& eql = key_equal(),
4. const allocator_type& alloc = allocator_type() );//构造空的unordered_map对象
5. 
6. template <class InputIterator>
7. unordered_map ( InputIterator first, InputIterator last,
8.                   size_type n = /* see below */,
9. const hasher& hf = hasher(),
10. const key_equal& eql = key_equal(),
11. const allocator_type& alloc = allocator_type() );//用迭代器范围构造unordered_map对象
12. 
13. unordered_map ( const unordered_map& ump );//拷贝构造一个unordered_map对象

(1)构造一个空的unordered_map对象

unordered_map<string, int> um1;

向里面插入元素:

1.     um1.insert(make_pair<string, int>("自行车", 8));
2.  um1.insert(make_pair<string, int>("消防车", 1));
3.  um1.insert(make_pair<string, int>("洒水车", 6));
4.  um1.insert(make_pair<string, int>("搅拌车", 7));
5.  um1.insert(make_pair<string, int>("小汽车", 5));

(2)用迭代器范围构造unordered_set对象

用um1的迭代器范围构造um2:

unordered_map<string, int> um2(um1.begin(), um1.end());

(3)拷贝构造一个unordered_set对象

用um2拷贝构造um3:

unordered_map<string, int> um3(um2);

3.容量

(1)empty( )

判断unordered_map是否为空:

bool empty() const noexcept;

判断um1是否为空:

cout << um1.empty() << endl;

(2)size( )

返回unordered_map中的元素个数:

size_type size() const noexcept;

求um1中元素的个数:

cout << um1.size() << endl;

(3)max_size( )

返回 unordered_map可存储的最大元素个数:

size_type max_size() const noexcept;

求um1最大元素个数 :

cout << um1.max_size() << endl;

 

4.迭代器

(1)begin( )

返回迭代器开始:

iterator begin() noexcept;

返回um1迭代器开始:

unordered_map<string, int>::iterator it = um1.begin();

(2)end( )

返回迭代器结尾:

iterator end() noexcept;

返回um1迭代器结尾:

um1.end();

5.元素操作符[ ]

访问key为k的元素,如果存在就返回value的引用:

mapped_type& operator[] ( const key_type& k );

访问key为小汽车的元素,并返回小汽车对应的value的引用:

cout << um1["小汽车"] << endl;

相关文章
|
7天前
|
编译器 C语言 C++
【c++丨STL】list模拟实现(附源码)
本文介绍了如何模拟实现C++中的`list`容器。`list`底层采用双向带头循环链表结构,相较于`vector`和`string`更为复杂。文章首先回顾了`list`的基本结构和常用接口,然后详细讲解了节点、迭代器及容器的实现过程。 最终,通过这些步骤,我们成功模拟实现了`list`容器的功能。文章最后提供了完整的代码实现,并简要总结了实现过程中的关键点。 如果你对双向链表或`list`的底层实现感兴趣,建议先掌握相关基础知识后再阅读本文,以便更好地理解内容。
15 1
|
20天前
|
算法 C语言 C++
【c++丨STL】list的使用
本文介绍了STL容器`list`的使用方法及其主要功能。`list`是一种双向链表结构,适用于频繁的插入和删除操作。文章详细讲解了`list`的构造函数、析构函数、赋值重载、迭代器、容量接口、元素访问接口、增删查改操作以及一些特有的操作接口如`splice`、`remove_if`、`unique`、`merge`、`sort`和`reverse`。通过示例代码,读者可以更好地理解如何使用这些接口。最后,作者总结了`list`的特点和适用场景,并预告了后续关于`list`模拟实现的文章。
36 7
|
2月前
|
存储 编译器 C语言
【c++丨STL】vector的使用
本文介绍了C++ STL中的`vector`容器,包括其基本概念、主要接口及其使用方法。`vector`是一种动态数组,能够根据需要自动调整大小,提供了丰富的操作接口,如增删查改等。文章详细解释了`vector`的构造函数、赋值运算符、容量接口、迭代器接口、元素访问接口以及一些常用的增删操作函数。最后,还展示了如何使用`vector`创建字符串数组,体现了`vector`在实际编程中的灵活性和实用性。
66 4
|
2月前
|
C语言 C++ 容器
【c++丨STL】string模拟实现(附源码)
本文详细介绍了如何模拟实现C++ STL中的`string`类,包括其构造函数、拷贝构造、赋值重载、析构函数等基本功能,以及字符串的插入、删除、查找、比较等操作。文章还展示了如何实现输入输出流操作符,使自定义的`string`类能够方便地与`cin`和`cout`配合使用。通过这些实现,读者不仅能加深对`string`类的理解,还能提升对C++编程技巧的掌握。
81 5
|
23天前
|
存储 编译器 C语言
【c++丨STL】vector模拟实现
本文深入探讨了 `vector` 的底层实现原理,并尝试模拟实现其结构及常用接口。首先介绍了 `vector` 的底层是动态顺序表,使用三个迭代器(指针)来维护数组,分别为 `start`、`finish` 和 `end_of_storage`。接着详细讲解了如何实现 `vector` 的各种构造函数、析构函数、容量接口、迭代器接口、插入和删除操作等。最后提供了完整的模拟实现代码,帮助读者更好地理解和掌握 `vector` 的实现细节。
31 0
|
2月前
|
存储 编译器 C语言
【c++丨STL】string类的使用
本文介绍了C++中`string`类的基本概念及其主要接口。`string`类在C++标准库中扮演着重要角色,它提供了比C语言中字符串处理函数更丰富、安全和便捷的功能。文章详细讲解了`string`类的构造函数、赋值运算符、容量管理接口、元素访问及遍历方法、字符串修改操作、字符串运算接口、常量成员和非成员函数等内容。通过实例演示了如何使用这些接口进行字符串的创建、修改、查找和比较等操作,帮助读者更好地理解和掌握`string`类的应用。
63 2
|
2月前
|
存储 编译器 C++
【c++】类和对象(下)(取地址运算符重载、深究构造函数、类型转换、static修饰成员、友元、内部类、匿名对象)
本文介绍了C++中类和对象的高级特性,包括取地址运算符重载、构造函数的初始化列表、类型转换、static修饰成员、友元、内部类及匿名对象等内容。文章详细解释了每个概念的使用方法和注意事项,帮助读者深入了解C++面向对象编程的核心机制。
113 5
|
2月前
|
存储 编译器 C++
【c++】类和对象(中)(构造函数、析构函数、拷贝构造、赋值重载)
本文深入探讨了C++类的默认成员函数,包括构造函数、析构函数、拷贝构造函数和赋值重载。构造函数用于对象的初始化,析构函数用于对象销毁时的资源清理,拷贝构造函数用于对象的拷贝,赋值重载用于已存在对象的赋值。文章详细介绍了每个函数的特点、使用方法及注意事项,并提供了代码示例。这些默认成员函数确保了资源的正确管理和对象状态的维护。
116 4
|
2月前
|
存储 编译器 Linux
【c++】类和对象(上)(类的定义格式、访问限定符、类域、类的实例化、对象的内存大小、this指针)
本文介绍了C++中的类和对象,包括类的概念、定义格式、访问限定符、类域、对象的创建及内存大小、以及this指针。通过示例代码详细解释了类的定义、成员函数和成员变量的作用,以及如何使用访问限定符控制成员的访问权限。此外,还讨论了对象的内存分配规则和this指针的使用场景,帮助读者深入理解面向对象编程的核心概念。
153 4
|
3月前
|
存储 编译器 对象存储
【C++打怪之路Lv5】-- 类和对象(下)
【C++打怪之路Lv5】-- 类和对象(下)
35 4