C++ STL map I don't want it to sort!

话不多说,献上代码,您看看输出结果:

#include<iostream>
#include<map>
#include<string>
#include<algorithm>
int main()
{
    std::map<int, std::string> test_map = {
        {3, "string3"},
        {2, "string2" },
        {1, "string1" }
    };

    for (auto iter = test_map.begin(); iter != test_map.end(); iter++)
    {
        std::cout << iter->first << " " << iter->second << std::endl;
    }
    return 0;
}

首先 第一个问题
上面的代码在vs2015的debug 下会报错

>libcpmtd.lib(xlocale.obj) : error LNK2001: 无法解析的外部符号 __calloc_dbg
1>1111.obj : error LNK2001: 无法解析的外部符号 __calloc_dbg
1>libcpmtd.lib(_tolower.obj) : error LNK2001: 无法解析的外部符号 __calloc_dbg
1>libcpmtd.lib(locale.obj) : error LNK2001: 无法解析的外部符号 __calloc_dbg
1>libcpmtd.lib(wlocale.obj) : error LNK2001: 无法解析的外部符号 __calloc_dbg
1>libcpmtd.lib(StlCompareStringA.obj) : error LNK2001: 无法解析的外部符号 __free_dbg
1>libcpmtd.lib(locale.obj) : error LNK2001: 无法解析的外部符号 __free_dbg
1>libcpmtd.lib(wlocale.obj) : error LNK2001: 无法解析的外部符号 __free_dbg
1>libcpmtd.lib(xlocale.obj) : error LNK2001: 无法解析的外部符号 __free_dbg
1>libcpmtd.lib(xwcsxfrm.obj) : error LNK2001: 无法解析的外部符号 __free_dbg
1>1111.obj : error LNK2001: 无法解析的外部符号 __free_dbg
1>libcpmtd.lib(locale0.obj) : error LNK2001: 无法解析的外部符号 __free_dbg
1>libcpmtd.lib(cout.obj) : error LNK2001: 无法解析的外部符号 __free_dbg
1>libcpmtd.lib(StlLCMapStringA.obj) : error LNK2001: 无法解析的外部符号 __free_dbg
1>libcpmtd.lib(StlCompareStringA.obj) : error LNK2001: 无法解析的外部符号 __malloc_dbg
1>libcpmtd.lib(locale.obj) : error LNK2001: 无法解析的外部符号 __malloc_dbg
1>libcpmtd.lib(wlocale.obj) : error LNK2001: 无法解析的外部符号 __malloc_dbg
1>libcpmtd.lib(xlocale.obj) : error LNK2001: 无法解析的外部符号 __malloc_dbg
1>libcpmtd.lib(xwcsxfrm.obj) : error LNK2001: 无法解析的外部符号 __malloc_dbg
1>1111.obj : error LNK2001: 无法解析的外部符号 __malloc_dbg
1>libcpmtd.lib(locale0.obj) : error LNK2001: 无法解析的外部符号 __malloc_dbg
1>libcpmtd.lib(cout.obj) : error LNK2001: 无法解析的外部符号 __malloc_dbg
1>libcpmtd.lib(StlLCMapStringA.obj) : error LNK2001: 无法解析的外部符号 __malloc_dbg
1>libcpmtd.lib(xmbtowc.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW
1>libcpmtd.lib(StlCompareStringA.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW
1>libcpmtd.lib(StlLCMapStringA.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW
1>libcpmtd.lib(locale.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW
1>libcpmtd.lib(wlocale.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW
1>libcpmtd.lib(xlocale.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW
1>1111.obj : error LNK2001: 无法解析的外部符号 __CrtDbgReportW
1>libcpmtd.lib(stdthrow.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW
1>libcpmtd.lib(syserror.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW
1>libcpmtd.lib(cout.obj) : error LNK2001: 无法解析的外部符号 __CrtDbgReportW
1>libcpmtd.lib(_tolower.obj) : error LNK2019: 无法解析的外部符号 __wcsdup_dbg,该符号在函数 __Getctype 中被引用
1>libcpmtd.lib(xstrcoll.obj) : error LNK2001: 无法解析的外部符号 __wcsdup_dbg
1>libcpmtd.lib(locale.obj) : error LNK2019: 无法解析的外部符号 __realloc_dbg,该符号在函数 "private: static void __cdecl std::locale::_Locimp::_Locimp_Addfac(class std::locale::_Locimp *,class std::locale::facet *,unsigned int)" (?_Locimp_Addfac@_Locimp@locale@std@@CAXPAV123@PAVfacet@23@I@Z) 中被引用
1>D:\test\testmapsort\Debug\testmapsort.exe : fatal error LNK1120: 6 个无法解析的外部命令

下面在release下运行:
我们的重点是上面代码的输出:

//1 string1
//2 string2
//3 string3

不知道你没有吃惊,反正我是吃惊了,用了很久的stl,也用了一些map,但是全然不知道map会把里面的元素进行排序!!

再看看map的描述,其中有这样一段话:
Internally, the elements in a map are always sorted by its key following a specific strict weak ordering criterion indicated by its internal comparison object (of type Compare).

那么,就上面的代码而言,我们还怎么key—value的形式存储,但是不进行排序呢?

可以使用vector和struct的组合:

#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<algorithm>
struct KeyValue{
    int key_;
    std::string value_;
    KeyValue(int key, std::string value) :key_(key), value_(value) {}

};
int main()
{
    /*std::map<int, std::string> test_map = { {3, "string3"}, {2, "string2" }, {1, "string1" } }; for (auto iter = test_map.begin(); iter != test_map.end(); iter++) { std::cout << iter->first << " " << iter->second << std::endl; }*/

    std::vector<KeyValue>test_unsort_map = {
        KeyValue(3, "string3"),
        KeyValue(2, "string2"),
        KeyValue(1, "string1")
    };
    for (auto iter = test_unsort_map.begin(); iter != test_unsort_map.end(); iter++)
    {
        std::cout << iter->key_ << " " << iter->value_ << std::endl;
    }


    return 0;
}

//3 string3
//2 string2
//1 string1

这个时候,你肯定会嫌麻烦啊。再查查:
好像有个东西叫std::unordered_map:

#include<iostream>
#include<map>
#include<vector>
#include<string>
#include<algorithm>
#include<unordered_map>
struct KeyValue{
    int key_;
    std::string value_;
    KeyValue(int key, std::string value) :key_(key), value_(value) {}

};
int main()
{
    std::unordered_map<int, std::string> test_map = {
        {3, "string3"},
        {2, "string2" },
        {1, "string1" }
    };

    for (auto iter = test_map.begin(); iter != test_map.end(); iter++)
    {
        std::cout << iter->first << " " << iter->second << std::endl;
    }

    /*std::vector<KeyValue>test_unsort_map = { KeyValue(3, "string3"), KeyValue(2, "string2"), KeyValue(1, "string1") }; for (auto iter = test_unsort_map.begin(); iter != test_unsort_map.end(); iter++) { std::cout << iter->key_ << " " << iter->value_ << std::endl; }*/
    return 0;
}

看看输出,完美。

你可能感兴趣的:(C++,sort,STL)