std :: map size总是一个

时间:2014-02-13 15:17:00

标签: c++ g++

我的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
任何帮助将不胜感激,
感谢

2 个答案:

答案 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