先决条件:在STL中映射
顾名思义, 地图是一个容器, 存储键值对。地图具有以下优势:在地图上搜寻, 由"键"定义仅O(1)时间复杂度, 因此使其在各种编码领域中都非常有用。本文讨论插入。
使用insert()
:插入功能用于在地图中插入键值对。插入后, 将对元素进行重新排序, 并使用键对地图进行排序。
此功能通过3种方式实现:
- 插入(对):此函数将配对插入地图。插入仅在密钥通过时发生不是已经设定。
它返回一个指针对。指向已经存在或新插入的对的第一个元素。返回布尔状态为" true"或" false"的第二个元素。
时间复杂度:log(n), 其中n是地图的大小 - 插入(提示, 一对):在此实现中, 提示指针与要插入的线对一起发送。提示指针的使用是为了帮助insert()知道实际的插入位置。因此, 尝试减少分配对的时间。
提示指针不会在特定位置强制插入。该功能将指针返回到该位置插入对的位置。
时间复杂度:log(n)其中n是地图的大小, 如果提示是最佳的, 则O(1) - 插入(beg_ptr, end_ptr):这种类型的插入是必需的插入其他容器对进入地图。如果重复对在目标容器中存在, 则不会插入。
时间复杂度:k * log(n), 其中n是地图的大小, k为否。插入的元素数
// C++ code to demonstrate the working of insert()
#include<iostream>
#include<map> // for map operations
using namespace std;
int main()
{
// declaring map
// of char and int
map< char , int > mp;
// declaring iterators
map< char , int >::iterator it ;
map< char , int >::iterator it1;
map< char , int >::iterator it2;
// declaring pair for return value of map containing
// map iterator and bool
pair <map< char , int >::iterator, bool > ptr;
// using insert() to insert single pair
// inserting 'a' with 20
ptr = mp.insert( pair< char , int >( 'a' , 20) );
// checking if the key was already present or newly inserted
if (ptr.second)
cout << "The key was newly inserted" ;
else
cout << "The key was already present" ;
cout << endl ;
// printing map pairs after insertion
cout << "The map pairs after 1st insertion are : \n" ;
for (it1 = mp.begin(); it1!=mp.end(); ++it1)
cout << it1->first << "->" << it1->second << endl;
it = mp.begin();
// inserting map pair using hint
mp.insert(it, pair< char , int >( 'b' , 24) );
cout << endl ;
// printing map pairs after insertion
cout << "The map pairs after 2nd insertion are : \n" ;
for (it1 = mp.begin(); it1!=mp.end(); ++it1)
cout << it1->first << "->" << it1->second << endl;
// initializing another map
map< char , int > mp2;
// using insert(beg_iter, end_iter) to copy all elements
mp2.insert(mp.begin(), mp.end());
cout << endl ;
// printing new map pairs after insertion
cout << "The new map pairs after insertion are : \n" ;
for (it1 = mp2.begin(); it1!=mp2.end(); ++it1)
cout << it1->first << "->" << it1->second << endl;
}
输出如下:
The key was newly inserted
The map pairs after 1st insertion are :
a->20
The map pairs after 2nd insertion are :
a->20
b->24
The new map pairs after insertion are :
a->20
b->24
使用Emplace
:emplace也用于将配对插入地图。此函数类似于上面讨论的" insert()", 唯一的区别是
"就地"建设
对的发生在与插入或复制现有对象的insert()相反的元素插入位置。
- emplace():使用就地构建策略插入对。将映射的大小增加1.。返回一个指针对。第一个元素是迭代器, 它指向插入对的位置。 2nd返回一个布尔变量, 指示已经存在或新创建的对。
时间复杂度:日志(n)(n是地图的大小) - emplace_hint():需要" hint_iterator"以获得插入位置的提示, 以可能减少插入已插入对的时间。这不会影响插入位置。它发生在内部定义的地方。
时间复杂度:日志(n)(n是地图的大小), 如果提示是最佳的, 则O(1)
// C++ code to demonstrate the working of emplace()
// and emplace_hint()
#include<iostream>
#include<map> // for map operations
using namespace std;
int main()
{
// declaring map
map< char , int > mp;
// declaring iterators
map< char , int >::iterator it;
map< char , int >::iterator it1;
map< char , int >::iterator it2;
// declaring pair for return value of map containing
// map iterator and bool
pair< map< char , int >::iterator, bool > ptr;
// using emplace() to insert pair element
// inserting 'a' to 24
// no "pair" needed, in-place construction
ptr = mp.emplace( 'a' , 24);
// checking if the pair was already present or newly inserted
// returns true. newly inserted
if (ptr.second)
cout << "The key was newly inserted" ;
else
cout << "The key was already present" ;
cout << endl;
// printing map pairs after insertion
cout << "The map pairs after 1st insertion are : \n" ;
for (it1 = mp.begin(); it1!=mp.end(); ++it1)
cout << it1->first << "->" << it1->second << endl;
cout << endl ;
// using emplace() to insert single pair
// inserting a to 24 // not inserted this time
ptr = mp.emplace( 'a' , 24);
// checking if the key was already present or newly inserted
// returns false. already inserted
if (ptr.second)
cout << "The key was newly inserted" ;
else
cout << "The key was already present" ;
cout << endl ;
// printing map pairs after insertion
cout << "The map pairs after 2nd insertion are : \n" ;
for (it1 = mp.begin(); it1!=mp.end(); ++it1)
cout << it1->first << "->" << it1->second << endl;
it = mp.begin();
// inserting map pair using hint
mp.emplace_hint(it, 'b' , 20);
cout << endl ;
// printing map pairs after insertion
cout << "The map pairs after 3rd insertion are : \n" ;
for (it1 = mp.begin(); it1!=mp.end(); ++it1)
cout << it1->first << "->" << it1->second << endl;
}
输出如下:
The key was newly inserted
The map pairs after 1st insertion are :
a->24
The key was already present
The map pairs after 2nd insertion are :
a->24
The map pairs after 3rd insertion are :
a->24
b->20
使用运算符[]
:" []"也可用于在地图中插入元素。与上述函数类似, 将指针返回到新构造的元素。区别在于此运算符
总是构造一个新元素
即, 即使未将值映射到键, 也会调用默认构造函数, 并将默认值" null"或"空"分配给键。
尺寸
的地图是
总是增加1
.
时间复杂度:log(n), 其中n是地图的大小
// C++ code to demonstrate the working of operator[]
#include<iostream>
#include<map> // for map operations
using namespace std;
int main()
{
// declaring map
map< char , int > mp;
// using [] to assign key to value
mp[ 'a' ] = 5;
mp[ 'b' ] = 6;
mp[ 'c' ] = 2;
// printing values
cout << "The element keys to a is : " ;
cout << mp[ 'a' ] << endl;
cout << "The element keys to b is : " ;
cout << mp[ 'b' ] << endl;
cout << "The element keys to c is : " ;
cout << mp[ 'c' ] << endl;
// default constructor is called
// prints 0
cout << "The element keys to d is : " ;
cout << mp[ 'd' ] << endl;
}
输出如下:
The element keys to a is : 5
The element keys to b is : 6
The element keys to c is : 2
The element keys to d is : 0
相关文章:在Map STL C ++中搜索
如果发现任何不正确的地方, 或者想分享有关上述主题的更多信息, 请写评论。
被认为是行业中最受欢迎的技能之一, 我们拥有自己的编码基础C ++ STL通过激烈的问题解决过程来训练和掌握这些概念。