multimap学习之插入数据操作insert,emplace ,emplace_hint

本文详细介绍了C++ multimap的插入操作,包括insert、emplace和emplace_hint函数的用法,并通过示例展示了它们的使用。同时,通过插入大量元素对比了emplace和insert的性能差异,结果显示emplace在效率上更优。
摘要由CSDN通过智能技术生成

本篇学习multimap插入数据相关的操作,具体的操作函数如下

insert

插入元素或结点 (C++17 起)
(公开成员函数)

emplace

(C++11)

原位构造元素
(公开成员函数)

emplace_hint

(C++11)

使用提示原位构造元素
(公开成员函数)
#include <map>
#include <string>
#include <time.h>
#include <iostream>

using namespace std;

void insertOperator()
{
    multimap<int, string> multimap1;
    //1.insert 插入元素或结点
    multimap1.insert({1, "hello"});
    auto map1it = multimap1.begin();
    multimap1.insert(map1it, {7, "333333"});
    multimap1.insert(pair<int, string>(3, "scott"));
    multimap1.insert(pair(2, "C++17 wirte"));//C++17 的写法s
    multimap1.insert({1, "world"});

    cout << "multimap1.size = " << multimap1.size() << " multimap1.max_size = " << multimap1.max_size() << endl;
    auto iter1 = multimap1.begin();
    cout << "multimap1 of value: " << endl;
    while (iter1 != multimap1.end())
    {
        cout << iter1->first << ": " << iter1->second << endl;
        iter1++;
    }
    //2..emplace原位构造元素
    multimap<int, string> multimap2;
    multimap2.emplace(11, "emplace aaaaa");
    multimap2.emplace(11, "emplace bbbbb");
    multimap2.emplace(pair(12, "emplace ccccc"));
    auto pair1 = multimap2.emplace(pair{13, "emplace ddddd"});
    //返回一个pair<iterator, bool>
    cout << "iterator->first:" << pair1->first << " second: " << pair1->second << endl;
    cout << "map2.size = " << multimap2.size() << " multimap2.max_size = " << multimap2.max_size() << endl;
    auto map2it = multimap2.begin();
    while(map2it != multimap2.end())
    {
        cout << map2it->first << ": " << map2it->second << endl;
        ++map2it;
    }
    cout << "---------------------------------" << endl;
    //3.emplace_hint使用提示原位构造元素
    multimap<int, string> multimap3;
    auto map3it = multimap3.begin();
    //返回一个迭代器
    auto map3Hint1 = multimap3.emplace_hint(map3it, 23, "emplace_hint aaaaa");
    multimap3.emplace_hint(map3it, 21, "emplace_hint bbbbbb");
    auto map3Hint2 = multimap3.emplace_hint(map3it, 21, "emplace_hint cccccc");

    multimap<int, string>::iterator map3it2 = multimap3.begin();
    while(map3it2 != multimap3.end())
    {
        cout << map3it2->first << ": " << map3it2->second << endl;
        ++map3it2;
    }
    cout << "emplace_hint1 " << map3Hint1->first << ": " << map3Hint1->second << endl;
    cout << "emplace_hint2 " << map3Hint2->first << ": " << map3Hint2->second << endl;

    //插入时间对比
    int count = 1000000;

    multimap<int, string> multimap4;
    double startTime1 = clock();//1计算开始
    for(int i = 0; i < count; i++)//214748
    {
        multimap4.emplace(pair{i, "hello"});
    }
    double endTime1 = clock();//1时间结束
    multimap4.clear();
    cout << "for    1 run time is: " << (double)(endTime1 - startTime1) / CLOCKS_PER_SEC << "s" << endl;
    cout << endl;

    multimap<int, string> multimap5;
    double startTime2 = clock();//1计算开始
    for(int i = 0; i < count; i++)//214748
    {
        multimap5.insert(pair{i, "hello"});
    }
    double endTime2 = clock();//1时间结束
    multimap5.clear();
    cout << "for    2 run time is: " << (double)(endTime2 - startTime2) / CLOCKS_PER_SEC << "s" << endl;
    cout << endl;

}

int main()
{

    insertOperator();

    return 0;
}

运行结果:

 

参考:

https://zh.cppreference.com/w/cpp/container/multimap

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: 在 C++ 中,以下容器可以使用 `emplace_back` 函数: 1. `std::vector` 2. `std::deque` 3. `std::list` 4. `std::forward_list` 5. `std::set` 6. `std::multiset` 7. `std::map` 8. `std::multimap` 9. `std::unordered_set` 10. `std::unordered_multiset` 11. `std::unordered_map` 12. `std::unordered_multimap` `emplace_back` 的作用是在容器的尾部插入一个元素,并利用该元素的构造函数直接在容器中构造该元素,避免了一次不必要的拷贝构造,从而提高了效率。 ### 回答2: 在C++中,有以下几种容器可以使用emplace_back()函数: 1. 向量(vector):向量是一种动态数组,可以使用emplace_back()函数在向量的末尾添加元素。emplace_back()函数会将指定参数作为元素的构造函数的参数,直接在向量的末尾构造一个新元素。 2. 列表(list):列表是一种双向链表,可以使用emplace_back()函数在列表的末尾添加元素。emplace_back()函数会将指定参数作为元素的构造函数的参数,直接在列表的末尾构造一个新元素。 3. 队列(queue):队列是一种先进先出的容器,可以使用emplace_back()函数在队列的末尾添加元素。emplace_back()函数会将指定参数作为元素的构造函数的参数,直接在队列的末尾构造一个新元素。 4. 双端队列(deque):双端队列是一种允许在两端进行插入和删除操作的容器,可以使用emplace_back()函数在双端队列的末尾添加元素。emplace_back()函数会将指定参数作为元素的构造函数的参数,直接在双端队列的末尾构造一个新元素。 总之,无论是动态数组、链表还是队列,只要支持在容器末尾添加元素的操作,都可以使用emplace_back()函数来构造和插入新元素。该函数可以避免额外的拷贝开销,效率更高。 ### 回答3: 在C++中,可以使用emplace_back函数来在容器的末尾直接构造并插入元素。emplace_back函数适用于以下几种容器: 1. vector:vector是一种动态数组,可以使用emplace_back来构造并插入元素。例如: ```cpp std::vector<int> vec; vec.emplace_back(1); // 构造并插入1 vec.emplace_back(2); // 构造并插入2 ``` 2. deque:deque是一种双端队列,也可以使用emplace_back函数来构造并插入元素。例如: ```cpp std::deque<int> dq; dq.emplace_back(1); // 构造并插入1 dq.emplace_back(2); // 构造并插入2 ``` 3. list:list是一种双向链表,同样可以使用emplace_back函数来构造并插入元素。例如: ```cpp std::list<int> lst; lst.emplace_back(1); // 构造并插入1 lst.emplace_back(2); // 构造并插入2 ``` 4. forward_list:forward_list是一种单向链表,也可以使用emplace_back函数来构造并插入元素。例如: ```cpp std::forward_list<int> flst; flst.emplace_back(1); // 构造并插入1 flst.emplace_back(2); // 构造并插入2 ``` 5. stack:stack是一种后进先出(LIFO)的容器适配器,它底层可以选择使用deque或list来实现。但是由于stack的特性,其只提供push和pop函数,不支持直接构造并插入元素。 总结起来,可以使用emplace_back函数来在vector、deque、list和forward_list这些容器的末尾直接构造并插入元素,而不需要先构造元素再插入。但要注意,对于stack这种容器适配器,不支持emplace_back函数。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值