2010-04-10 141 views
1

我有一個要求,用C++創建兩個不同的地圖。密鑰的類型是CHAR*,Value是指向結構體的指針。我用這些對填充2個地圖,分別進行迭代。在創建兩個映射之後,我需要找到所有這樣的實例,其中CHAR*引用的字符串的值是相同的。在C++中std :: map鍵

對於這個我使用下面的代碼:

typedef struct _STRUCTTYPE 
{ 
.. 
} STRUCTTYPE, *PSTRUCTTYPE; 

typedef pair <CHAR *,PSTRUCTTYPE> kvpair; 

.. 

CHAR *xyz; 

PSTRUCTTYPE abc; 

// after filling the information; 

Map.insert (kvpair(xyz,abc)); 


// the above is repeated x times for the first map, and y times for the second map. 
// after both are filled out; 

std::map<CHAR *, PSTRUCTTYPE>::iterator Iter,findIter; 

for (Iter=iteratedMap->begin();Iter!=iteratedMap->end();mapIterator++) 
{ 
    char *key = Iter->first; 

    printf("%s\n",key); 

    findIter=otherMap->find(key); 

    //printf("%u",findIter->second); 

    if (findIter!=otherMap->end()) 
    { 
    printf("Match!\n"); 
    } 
} 

上面的代碼並沒有表現出任何的比賽,雖然在這兩種地圖鍵列表表現出明顯的匹配。我的理解是CHAR *的equals運算符只是指針的內存地址。

我的問題是,我應該怎麼做來改變這種類型的鍵的等號運算符,或者我可以使用不同的數據類型的字符串?

+0

我不想編輯它,因爲它可能會轉換成社區Wiki,但如果你使用1010101模式的按鈕(就像KennyTM爲你做的那樣),代碼將會格式化尖括號將正確顯示。 – 2010-04-10 13:54:00

回答

4

我的理解是CHAR *的equals運算符只是指針的內存地址。

你的理解是正確的。

最簡單的事情就是使用std::string作爲關鍵。這樣,你得到了比較實際的字符串值不費力的工作:

std::map<std::string, PSTRUCTTYPE> m; 
PSTRUCTTYPE s = bar(); 
m.insert(std::make_pair("foo", s)); 

if(m.find("foo") != m.end()) { 
    // works now 
} 

注意,如果你並不總是手動刪除它們,你可能會泄漏內存爲您的結構。如果您無法按價值進行存儲,請考慮使用智能指針。根據您的用例

,你不必neccessarily存儲指向的結構:

std::map<std::string, STRUCTTYPE> m; 
m.insert(std::make_pair("foo", STRUCTTYPE(whatever))); 

最後請注意:typedef ING結構你正在做的方式是C-主義,在C++以下就足夠了:

typedef struct STRUCTTYPE { 
    // ... 
} *PSTRUCTTYPE; 
+0

其實我的代碼使用sprintf()很多,所以我不得不改變這些事件。一旦我做出這些改變,我會盡快回復你。謝謝無論如何:) – Soumava 2010-04-10 13:55:00

+0

我做了sprintf並獲得了字符串中的char *鍵,然後做了std :: string key1 = key; 現在似乎工作。 :) 謝謝。 – Soumava 2010-04-10 14:10:23

+2

有關PSTRUCTTYPE的說明 - typedefing隱藏了事實是指針的事實被很多人認爲是不好的風格。 – 2010-04-10 14:16:01

0

如果使用std::string而不是char *,那麼可以使用更方便的比較函數。此外,您可以使用STL set_intersection算法(請參閱here以瞭解更多詳細信息)來查找兩個已排序容器中的共享元素(std::map當然已排序),而不是編寫自己的密鑰匹配代碼。這裏是一個例子

typedef map<std::string, STRUCTTYPE *> ExampleMap; 
ExampleMap inputMap1, inputMap2, matchedMap; 

// Insert elements to input maps 
inputMap1.insert(...); 

// Put common elements of inputMap1 and inputMap2 into matchedMap 
std::set_intersection(inputMap1.begin(), inputMap1.end(), inputMap2.begin(), inputMap2.end(), matchedMap.begin()); 

for(ExampleMap::iterator iter = matchedMap.begin(); iter != matchedMap.end(); ++iter) 
{ 
    // Do things with matched elements 
    std::cout << iter->first << endl; 
} 
+0

這是一個非常有用的功能..切斷了很多代碼。謝謝。 – Soumava 2010-04-11 13:43:26