zoukankan      html  css  js  c++  java
  • 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 << "
    test_multiset()......... 
    ";
    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
    View Code

    // 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
    View Code

    // 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 }
    View Code

    ## 运行示例

    [root@192 src]# g++ -o test_multiset main.cpp pub.h test_multiset.hpp
    [root@192 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
    [root@192 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)

  • 相关阅读:
    java之md5加密算法
    springboot之快速创建项目
    java之idea打jar包
    java只http改成https访问
    springboot之读取配置文件
    springboot之项目打包
    Git之fatal: remote origin already exists
    WebStorm ES6 语法支持设置和ES6语法的JS文件编译为ES5语法文件
    转 JavaScript里的数组转化新方法Array.From
    网页特殊符号HTML代码大全
  • 原文地址:https://www.cnblogs.com/ccf19881030/p/12005134.html
Copyright © 2011-2022 走看看