std::map 內部為紅黑樹實現,鍵值自動按升序排序,而非保持插入順序:
map m = {{3,"s3"}, {2,"s2"}, {1,"s1"}};
for (auto& p : m) cout << p.first << " " << p.second << endl;
// 輸出:
// 1 s1
// 2 s2
// 3 s3 ← 自動排序,非插入順序
「Internally, the elements in a map are always sorted by its key following a specific strict weak ordering criterion...」
struct KeyValue { int key; string value; };
vector vec = {{3,"s3"}, {2,"s2"}, {1,"s1"}};
// 遍歷即插入順序
// 查找需線性掃描
#include
unordered_map um = {{3,"s3"}, {2,"s2"}, {1,"s1"}};
for (auto& p : um) cout << p.first << " " << p.second << endl;
// 輸出順序不確定(取決於哈希分佈),但非鍵值排序
// 查找/插入 O(1) 平均
#include
#include
#include
using namespace boost::multi_index;
struct Record { int id; string data; };
typedef multi_index_container<
Record,
indexed_by<
sequenced<>, // 保持插入順序
ordered_unique> // 按 id 有序
>
> Container;
原文提到的 __calloc_dbg 等未解析外部符號,通常是運行時庫不匹配:
Multi-threaded Debug (/MTd) 或 Multi-threaded Debug DLL (/MDd)/MT 或 /MD| 需求 | 推薦容器 | 查找 | 插入 | 順序 |
|---|---|---|---|---|
| 鍵值有序 + 快速查找 | map | O(log n) | O(log n) | 鍵值升序 |
| 保持插入順序 + 快速查找 | unordered_map + 額外 vector 記錄順序 | O(1) | O(1) | 插入順序 |
| 保持插入順序 + 偶爾查找 | vector<pair<K,V>> | O(n) | O(1) | 插入順序 |
| 同時需要有序/無序視圖 | boost::multi_index | O(log n)/O(1) | O(log n) | 多索引 |
std::map 保證鍵值有序,不保持插入順序。需保持插入順序時:
unordered_map + vector 記錄順序vector<pair> 簡單直接boost::multi_index同時注意編譯器運行時庫一致性,避免 Debug/Release 混用導致鏈接錯誤。