程序師世界是廣大編程愛好者互助、分享、學習的平台,程序師世界有你更精彩!
首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫知識
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
 程式師世界 >> 編程語言 >> C語言 >> C++ >> 關於C++ >> C++ STL map I don't want it to sort!(獻上代碼)

C++ STL map I don't want it to sort!(獻上代碼)

編輯:關於C++

話不多說,獻上代碼,您看看輸出結果:

#include
#include
#include
#include
int main()
{
    std::map 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
#include
#include
#include
#include
struct KeyValue{
    int key_;
    std::string value_;
    KeyValue(int key, std::string value) :key_(key), value_(value) {}

};
int main()
{
    /*std::map 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::vectortest_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
#include
#include
#include
#include
#include
struct KeyValue{
    int key_;
    std::string value_;
    KeyValue(int key, std::string value) :key_(key), value_(value) {}

};
int main()
{
    std::unordered_map 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::vectortest_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;
}

看看輸出,完美。

   
  1. 上一頁:
  2. 下一頁:
Copyright © 程式師世界 All Rights Reserved