2015-12-10 48 views
-1

我有一個插入值映射的問題。插入映射鍵總是存在

#define SIZE 5 
#define pair<unsigned char *, int> pair_t 

struct myCmp 
{ 
    int operator()(const unsigned char arr_1[SIZE], const unsigned char arr_2[SIZE]) 
    { 
    printf("arr_1: %02x,%02x,%02x,%02x,%02x arr_2: %02x,%02x,%02x,%02x,%02x", 
        arr_1[0], arr_1[1],arr_1[2],arr_1[3],arr_1[4], 
        arr_2[0],arr_2[1],arr_2[2],arr_2[3],arr_2[4]); 
    } 
} 
void main() 
{ 
    map<unsigned char *, int, myCmp> myMap; 
    map<unsigned char *, int, myCmp>::iterator it; 

    unsigned char arr[SIZE] = {'\0'}; 

    //---- first insertion ----// 

    arr[0] 0xa; 
    pait_t data_1(arr,1); 
    pair< map<unsigned char *, int, myCmp>::iterator> ret_1 = myMap.insert(data_1); 

    if(ret_1.second) 
    printf("added one"); 

    else 
    printf("already exist one"); 



//---- second insertion ----// 

    arr[1] 0xb; 
    pait_t data_2(arr,2); 
    pair< map<unsigned char *, int, myCmp>::iterator> ret_2 = myMap.insert(data_2); 

    if(ret_2.second) 
    printf("added two"); 

    else 
    printf("already exist two"); 
} 

第一插入正常,myCmp尚未啓動,我得到added one

的問題是與第二齣入,似乎myCmp得到了相同的兩個數組始終返回0(等於) - 它打印arr_1: ab arr_2: ab 因此ret_2.second是假(鍵已存在)並打印already exist two

我試圖改變ARR的值,但它沒有任何影響。

奇怪的部分是當我試圖做同樣的事情,而不是char *我用string(當然改變了所有的簽名..),myCmp函數有兩個不同的值。

我不能老是用字符串作爲鍵..

我不知道爲什麼它的行爲像這樣和myCmp得到兩個相同的值。

我很樂意爲此提供指導。

+0

'data_1'和'data_2'都有'arr',因此它們具有相同的值。更糟糕的是,'data_1'在插入地圖後發生變化,因爲'arr'已更改。在將其添加到地圖之前,可以使用'std :: string'或將每個'char *'複製到新的內存中。第一種解決方案更好,更容易。 – nwp

回答

0

你給的arr地址在兩種情況下都是一樣的。嘗試使用std::string