IT数码 购物 网址 头条 软件 日历 阅读 图书馆
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
图片批量下载器
↓批量下载图片,美女图库↓
图片自动播放器
↓图片自动播放器↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁
 
   -> C++知识库 -> Dive into C++ -> 正文阅读

[C++知识库]Dive into C++

std::map

1. insert()

#include <iostream>
#include <map>

using namespace std;

int main() {
    std::map<char, int> mymap;

    // first insert function version (single parameter):
    mymap.insert(std::pair<char, int>('a', 100));
    mymap.insert(std::pair<char, int>('z', 200));

    std::pair<std::map<char, int>::iterator, bool> ret;
    ret = mymap.insert(std::pair<char, int>('z', 500));
    if (ret.second == false) {
        std::cout << "element 'z' already existed";
        std::cout << " with a value of " << ret.first->second << '\n';
    }

    // second insert function version (with hint position):
    std::map<char, int>::iterator it = mymap.begin();
    mymap.insert(it, std::pair<char, int>('b', 300));  // max efficiency inserting
    mymap.insert(it, std::pair<char, int>('c', 400));  // no max efficiency inserting

    // third insert function version (range insertion):
    std::map<char, int> anothermap;
    anothermap.insert(mymap.begin(), mymap.find('c'));

    // showing contents:
    std::cout << "mymap contains:\n";
    for (it = mymap.begin(); it != mymap.end(); ++it)
        std::cout << it->first << " => " << it->second << '\n';

    std::cout << "anothermap contains:\n";
    for (it = anothermap.begin(); it != anothermap.end(); ++it)
        std::cout << it->first << " => " << it->second << '\n';

    return 0;
}
hupeidong@ZBMac-C02F31WYM Desktop % ./main
element 'z' already existed with a value of 200
mymap contains:
a => 100
b => 300
c => 400
z => 200
anothermap contains:
a => 100
b => 300

2. emplace()

map 容器的成员函数 emplace() 可以在适当的位置直接构造新元素,从而避免复制和移动操作。它的参数通常是构造元素,也就是 pair<const K,T> 对象所需要的。只有当容器中现有元素的键与这个元素的键不同时,才会构造这个元素。

成员函数 emplace() 和 insert() 返回的 pair 对象提供的指示相同。pair 的成员变量 first 是一个指向插入元素或阻止插入的元素的迭代器;成员变量 second 是个布尔值,如果元素插入成功,second 就为 true。

// map::emplace
#include <iostream>
#include <map>

int main() {
    std::map<char, int> mymap;

    mymap.emplace('x', 100);
    mymap.emplace('y', 200);
    mymap.emplace('z', 100);

    std::cout << "mymap contains:";
    for (auto& x : mymap)
        std::cout << " [" << x.first << ':' << x.second << ']';
    std::cout << '\n';

    return 0;
}
hupeidong@ZBMac-C02F31WYM Desktop % ./main
mymap contains: [x:100] [y:200] [z:100]

3. emplace_hint()

map 的成员函数 emplace_hint() 和 emplace() 生成元素的方式在本质上是一样的,除了必须为前者提供一个指示元素生成位置的迭代器,作为 emplace_hint() 的第一个参数。

// map::emplace_hint
#include <iostream>
#include <map>

int main() {
    std::map<char, int> mymap;
    auto it = mymap.end();

    it = mymap.emplace_hint(it, 'b', 10);
    mymap.emplace_hint(it, 'a', 12);
    mymap.emplace_hint(mymap.end(), 'c', 14);

    std::cout << "mymap contains:";
    for (auto& x : mymap)
        std::cout << " [" << x.first << ':' << x.second << ']';
    std::cout << '\n';

    return 0;
}
hupeidong@ZBMac-C02F31WYM Desktop % ./main                         
mymap contains: [a:12] [b:10] [c:14]

4. insert()和emplace()的区别

#include <iostream>
#include <map>

using namespace std;

class Demo {
public:
    Demo(int num) : var_(num) {
        std::cout << "构造函数" << endl;
    }
    Demo(const Demo& other) : var_(other.var_) {
        std::cout << "拷贝构造函数" << endl;
    }
    Demo(Demo&& other) : var_(other.var_) {
        std::cout << "移动构造函数" << endl;
    }

private:
    int var_;
};

int main() {
    std::map<char, Demo> mymap;

    cout << "insert():" << endl;
    mymap.insert(std::pair<char, Demo>('a', Demo(1)));

    cout << "emplace():" << endl;
    mymap.emplace('b', 1);

    cout << "emplace_hint():" << endl;
    mymap.emplace_hint(mymap.begin(), 'c', 1);

    return 0;
}
hupeidong@ZBMac-C02F31WYM Desktop % ./main
insert():
构造函数
移动构造函数
移动构造函数
emplace():
构造函数
emplace_hint():
构造函数

std::vector

1. push_back()和emplace_back()

#include <iostream>
#include <vector>

using namespace std;

class Demo {
public:
    Demo(int num) : var_(num) {
        std::cout << "构造函数" << endl;
    }
    Demo(const Demo& other) : var_(other.var_) {
        std::cout << "拷贝构造函数" << endl;
    }
    Demo(Demo&& other) : var_(other.var_) {
        std::cout << "移动构造函数" << endl;
    }

private:
    int var_;
};

int main() {
    std::vector<Demo> myvec;

    // 没有事先reserve,会重新申请一个空间,需要拷贝
    myvec.reserve(2);

    cout << "push_back():" << endl;
    myvec.push_back(Demo(1));

    cout << "emplace_back():" << endl;
    myvec.emplace_back(2);

    return 0;
}
hupeidong@ZBMac-C02F31WYM Desktop % ./main
push_back():
构造函数
移动构造函数
emplace_back():
构造函数

  C++知识库 最新文章
【C++】友元、嵌套类、异常、RTTI、类型转换
通讯录的思路与实现(C语言)
C++PrimerPlus 第七章 函数-C++的编程模块(
Problem C: 算法9-9~9-12:平衡二叉树的基本
MSVC C++ UTF-8编程
C++进阶 多态原理
简单string类c++实现
我的年度总结
【C语言】以深厚地基筑伟岸高楼-基础篇(六
c语言常见错误合集
上一篇文章      下一篇文章      查看所有文章
加:2021-08-03 10:58:44  更:2021-08-03 11:01:20 
 
开发: C++知识库 Java知识库 JavaScript Python PHP知识库 人工智能 区块链 大数据 移动开发 嵌入式 开发工具 数据结构与算法 开发测试 游戏开发 网络协议 系统运维
教程: HTML教程 CSS教程 JavaScript教程 Go语言教程 JQuery教程 VUE教程 VUE3教程 Bootstrap教程 SQL数据库教程 C语言教程 C++教程 Java教程 Python教程 Python3教程 C#教程
数码: 电脑 笔记本 显卡 显示器 固态硬盘 硬盘 耳机 手机 iphone vivo oppo 小米 华为 单反 装机 图拉丁

360图书馆 购物 三丰科技 阅读网 日历 万年历 2024年5日历 -2024/5/9 19:20:18-

图片自动播放器
↓图片自动播放器↓
TxT小说阅读器
↓语音阅读,小说下载,古典文学↓
一键清除垃圾
↓轻轻一点,清除系统垃圾↓
图片批量下载器
↓批量下载图片,美女图库↓
  网站联系: qq:121756557 email:121756557@qq.com  IT数码