c++关于multiset的头文件包含问题

最近在Bilibili上看到不少侯捷老师C++的视频教程,侯捷老师翻译了很多C++的经典书籍,比如《Essential C++中文版》、《STL源码剖析》,也写了《深入浅出MFC 第二版》。
使用到multiset这个关联容器时,本来以为Visual Studio2017中会提供#include <multiset>这个头文件,没想到加入到显示错误,后来查了下资料,说是multiset只是set的一个特例而已,只需要包含set的头文件即可,使用#include<set>即可。使用multimap时是也是类似的,需要包含#inlcude<map>头文件。
## 测试代码如下:
// test_multiset.hpp

 1 #ifndef _TEST_MULTISET_H
 2 #define _TEST_MULTISET_H
 3
 4 #include <set>
 5 #include <stdexcept>
 6 #include <string>
 7 #include <iostream>
 8 #include <ctime>
 9 #include <cstdio>   // snprintf()
10 #include <cstdlib>  // abort()
11 #include <algorithm>
12
13 #include "pub.h"
14
15 using std::multiset;
16 using std::cin;
17 using std::cout;
18 using std::endl;
19 using std::string;
20 using std::exception;
21 using std::find;
22 using std::sort;
23
24 namespace jj06
25 {
26     void test_multiset(long& totalCount)
27     {
28         cout << "\ntest_multiset()......... \n";
29
30     multiset<string> c;
31     char buf[10];
32     clock_t timeStart = clock();
33         for (long i = 0; i < totalCount; ++i)
34         {
35             try {
36                 snprintf(buf, 10, "%d", rand() % 65535);
37                 c.insert(string(buf));
38             }
39             catch (std::exception& e) {
40
41                 cout << "i=" << i << e.what() << endl;
42                 abort();
43             }
44         }
45
46         cout << "milli-seconds:" << (clock() - timeStart) << endl;
47         cout << "multiset.size()= " << c.size() << endl;
48         cout << "multiset.max_size()= " << c.max_size() << endl;
49
50     string target = get_a_target_string();
51         {
52             timeStart = clock();
53             auto pItem = ::find(c.begin(), c.end(), target);    // 比c.find(...)慢很多
54             cout << "::find(), mill-seconds: " << (clock() - timeStart) << endl;
55
56             if (pItem != c.end())
57                 cout << "found, " << *pItem << endl;
58             else
59                 cout << "not found! " << endl;
60         }
61
62         {
63             timeStart = clock();
64             auto pItem = c.find(target);        // 比::find(...)快很多
65             cout << "c.find(), mill-seconds: " << (clock() - timeStart) << endl;
66
67             if (pItem != c.end())
68                 cout << "found, " << *pItem << endl;
69             else
70                 cout << "not found! " << endl;
71         }
72     }
73 }
74 #endif

// pub.h

 1 #ifndef _PUB_H_
 2 #define _PUB_H_
 3
 4 #ifdef _MSC_VER
 5 #define snprintf _snprintf
 6 #endif
 7
 8 #include <string>
 9 #include <cstdio>
10 #include <iostream>
11
12 using std::string;
13 using std::cin;
14 using std::cout;
15
16 //const long ASIZE = 1000000;
17 const long ASIZE = 50000;
18
19 long get_a_target_long()
20 {
21 long target = 0;
22 cout << "target (0~" << RAND_MAX << "): ";
23 cin >> target;
24
25 return target;
26 }
27
28 string get_a_target_string()
29 {
30 long target = 0;
31 char buf[10];
32
33 cout << "target (0~" << RAND_MAX << "): ";
34 cin >> target;
35 snprintf(buf, 10, "%d", target);
36
37 return string(buf);
38 }
39 int compareLongs(const void* a, const void* b)
40 {
41 return (*(long*)a - *(long*)b);
42 }
43
44 int compareStrings(const void* a, const void* b)
45 {
46 if (*(string*)a > *(string*)b)
47 return 1;
48 else if(*(string*)a < *(string*)b)
49 return -1;
50 else
51 return 0;
52 }
53 #endif

// main.cpp

 1 #include "test_multiset.hpp"
 2 int main(int argc, char* argv[])
 3 {
 4 long totalCount;
 5 cout << "how many elements:";
 6 cin >> totalCount;
 7
 8 srand((unsigned)time(NULL));
 9 jj06::test_multiset(totalCount);
10
11 getchar();
12
13 return 0;
14 }

## 运行示例

[[email protected] src]# g++ -o test_multiset main.cpp pub.h test_multiset.hpp
[[email protected] src]# ./test_multiset
how many elements:1000000

test_multiset().........
milli-seconds:9750000
multiset.size()= 1000000
multiset.max_size()= 461168601842738790
target (0~2147483647): 23456
::find(), mill-seconds: 50000
found, 23456
c.find(), mill-seconds: 0
found, 23456
[[email protected] src]# 、

## 完整的代码见本人的Github:

[stl_container_test](https://github.com/ccf19881030/stl_container_test)
### 附带侯捷老师B站的C++相关视频链接地址:
* [C++ STL与泛型编程高级-侯捷](https://www.bilibili.com/video/av48068999?p=6)
* [C++面向对象高级编程(侯捷)](https://www.bilibili.com/video/av27135524)
* [C++标准11-14](https://www.bilibili.com/video/av51795083)

原文地址:https://www.cnblogs.com/ccf19881030/p/12005134.html

时间: 2024-08-12 06:38:16

c++关于multiset的头文件包含问题的相关文章

c++ 头文件包含问题-include&amp;class

http://blog.csdn.net/jiajia4336/article/details/8996254 前向声明概念(forward declaration) 在程序中引入了类类型的B.在声明之后,定义之前,类B是一个不完全类型(incompete type),即已知B是一个类型,但不知道包含哪些成员.不完全类型只能以有限方式使用,不能定义该类型的对象,不完全类型只能用于定义指向该类型的指针及引用,或者用于声明(而不是定义)使用该类型作为形参类型或返回类型的函数. 前向声明应用场景 当你

windows内核编程--头文件包含的奇葩的问题

先给解决办法:如果您认为您的头文件包含木有问题,请用WDK的build命令编译试试,很有可能是因为您用了VS 2010 + EASY SYS 环境的问题 使用VS 2010 + EASY SYS 搭建的环境中,包含了ke.h 这是在网上找的关于用到EPROCESS和ETHREAD的头文件. 在这种环境下编译一直出错. 在这里不得不大声说一句:妈B,怎么调戏都调戏不好... 如这张图: 解决办法是: 不用调.. 真的不用调. 只需要用WDK带的编译器BUILD,就OK

visual studio C++ 手工管理头文件包含路径的方法

这里以VS2010为例,说明如何通过自定义项目属性来手工管理VC++目录. 第一步:打开一个VC++工程. 第二步: 选择视图菜单下的属性管理器. 第三步:右键点击我们的工程,选择"添加新项目属性表". 第四步:输入自己想好的名字,注意目录不要修改,建议放到自己的工程目录下,这个是默认的. 第五步:点击添加,回到我们的工程目录,应该能找到bt.props这个文件. 第六步:用编辑工具打开这个文件,它是一个xml文件,可以自己选择好用的编辑工具. <?xml version=&qu

OpenCV头文件包含问题

opencv从2.2版本以后<opencv root>include下有两个文件夹 opencv 和opencv2.从官方的意思来看,它逐渐喜欢用opencv2里面的那种包含头文件的方式. 注意:<opencv root>是opencv2.2安装路径.每个人的路径都可能有所不同!! Opencv.hpp本身是一个头文件,它包含了opencv全部的头文件.有图有真相: #ifndef __OPENCV_ALL_HPP__ #define __OPENCV_ALL_HPP__ #inc

xcode 编译错误的 之 头文件 包含成.m了

duplicate symbol _OBJC_CLASS_$_AutoTableViewViewController in: /Users/apple/Library/Developer/Xcode/DerivedData/masonry自动布局-cragjuqaxcsyhcckrysbcptlqprh/Build/Intermediates/masonry自动布局.build/Debug-iphonesimulator/masonry自动布局.build/Objects-normal/i386

头文件包含方式

1,系统自带的头文件用尖括号括起来,这样编译器会在系统文件目录下查找. #include <xxx.h> 2,用户自定义的文件用双引号括起来,编译器首先会在用户目录下查找,然后在到C++安装目录(比如VC中可以指定和修改库文件查找路径,Unix和Linux中可以通过环境变量来设定)中查找,最后在系统文件中查找. #include "xxx.h"

include &lt;ctype.h&gt; 头文件包含函数总结

里面包含的函数主要是: 1.字符测试函数,函数原型一般为:int isXXXX( int ); 参数为int, 只能正确处理[0, 127]. 2.字符映射函数,函数原型一般为:int toXXXX( int ); 对参数进行检测, 若符合范围则转换, 否则不变 int tolower( int );  'A'~'Z' ==> 'a'~'z'   // 先判断是不是小写字母,如果不是,则将其转换成小写字母   (简单记忆:to lower int toupper( int );  'a'~'z'

stm32使用rt-thread在文件《stm32f1xx_hal.h》中头文件包含顺序引出的错误

@2019-01-24 [小记] 在学习 rt-thread BSP制作过程中,发现文件<stm32f1xx_hal.h>中 Env工具生成的原始顺序 1. #include "stm32f1xx_hal_conf.h" 2. #include <rtthread.h> 这将导致 <stm32f1xx_hal_spi.h> 文件找不到而编译出错,调整顺序后则OK,原因暂不详 原文地址:https://www.cnblogs.com/skullboye

C++中类的前置声明和包含头文件的区别

一.类嵌套的疑问 C++头文件重复包含实在是一个令人头痛的问题,假设我们有两个类A和B,分别定义在各自的头文件A.h和B.h中,但是在A中要用到B,B中也要用到A,但是这样的写法当然是错误的: class B; class A{ public: B b;}; class B{ public: A a;}; 因为在A对象中要开辟一块属于B的空间,而B中又有A的空间,是一个逻辑错误,无法实现的,在这里我们只需要把其中的一个A类中的B类型成员改成指针形式就可以避免这个无限延伸的怪圈了,为什么要更改A而