我的std :: map有问题。使用以下代码:
struct cmp_address {
bool operator()(unsigned long const a, unsigned long const b) {
return a == b;
}
};
void test() {
map<unsigned long,char,cmp_address> data;
int numRows = 1000; //this is the number of rows (or number of IP addresses)
for (int i=1;i<numRows;i++) {
struct in_addr inp;
int res = inet_aton("An IP ADdress", &inp);
if (res) {
// address is valid
unsigned long addr = inp.s_addr;
// data.insert(std::make_pair<unsigned long,char>(addr, 1)); //doesn't work
data[addr] = 1; //dowsn't work
}
}
printf("Loaded rows=%d\n", data.size()); //size is always=1
};
地图长度为关键,char为值。
我在地图中插入大约1,200万个键值对,但大小总是为1
任何帮助将不胜感激,
感谢
答案 0 :(得分:1)
如果你将一个常量字符串传递给inet_aton
,你将得到一个常量结果,因此得到一个常量键......所以你只需要将地图中相同的条目替换1000次。 / p>
如果您真的想要一张包含同一个键的多个值的地图,则应使用std::multimap
。
答案 1 :(得分:1)
您的比较器错误。
它应该定义一个严格的弱排序但你的更接近相反。因此,std::map
的内部算法都会崩溃并导致未定义的行为。
你可能意味着:
struct cmp_address {
bool operator()(unsigned long const a, unsigned long const b) {
return a < b;
}
};
从std::map
的默认比较器为std::less
这一事实中获取灵感。实际上,这意味着您根本不需要自定义比较器。
此外,您一遍又一遍地插入相同的密钥;它始终是"An IP ADdress"
的IP地址。地图每个键只有一个值。如果您希望每个键有多个值,请选择std::multimap
。