std::map 預設以 std::less<Key> 排序鍵值。若鍵為 const char*,預設比較的是指標位址而非字串內容。本文示範如何撰寫仿函式(Functor)ltstr,使 map<const char*, int, ltstr> 依字典序自動排序,並給出完整可編譯範例。
struct ltstr {
bool operator()(const char* s1, const char* s2) const {
return strcmp(s1, s2) < 0; // 字典序比較
}
};
#pragma warning(disable:4786)
#include <iostream>
#include <string>
#include <map>
#include <algorithm>
using namespace std;
struct ltstr {
bool operator()(const char* s1, const char* s2) const {
return strcmp(s1, s2) < 0;
}
};
typedef map<const char*, int, ltstr> MYDATAMAP;
typedef MYDATAMAP::iterator IterMyData;
int main() {
MYDATAMAP data;
data.insert(MYDATAMAP::value_type("3", 9));
data.insert(MYDATAMAP::value_type("4", 9));
data.insert(MYDATAMAP::value_type("1", 9));
data.insert(MYDATAMAP::value_type("2", 9));
for (IterMyData it = data.begin(); it != data.end(); ++it)
cout << "Key: " << it->first << " Value: " << it->second << endl;
data.clear();
return 0;
}
Key: 1 Value: 9
Key: 2 Value: 9
Key: 3 Value: 9
Key: 4 Value: 9
std::string,直接用預設 less<> 即可,避免指標生命週期管理風險。std::string_view (C++17) 做鍵,並提供自訂 less<> 特化。auto cmp = [](const char* a, const char* b){ return strcmp(a,b)<0; }; 搭配 std::map<const char*, int, decltype(cmp)> m(cmp);。「map 的比較函式必須滿足嚴格弱序;對字串鍵,優先選std::string或string_view,讓標準庫處理記憶體與比較邏輯。」