簡體   English   中英

帶有自定義比較器的C ++ STL映射,用於存儲空指針

[英]C++ STL map with custom comparator storing null pointers

我正在嘗試為管理包含指針的STL映射的對象編寫復制構造函數,其中鍵是一個字符串。 但是,當我嘗試在地圖中插入新值時,指針將設置為NULL:

// ...
for(std::map<std::string, data_base*, order>::const_iterator it = other.elements.begin();
it != other.elements.end(); ++it){
    data_base *t = it->second->clone();
    std::cout << "CLONE: " << std::hex << t << std::endl;
    elements[it->first] = t;
    std::cout << "INSERTED: " << std::hex << elements[it->first] << std::endl;
}
// ...

other是被復制的對象和elements的映射。 clone()方法返回一個指向新對象的指針(通過new )。

運行上面的代碼我得到類似的東西:

CLONE: 0xcfbbc0
INSERTED: 0

我不是一個非常有經驗的程序員,這個問題可能很容易修復,但我沒有找到任何解決方案來搜索它。

非常感謝你的時間。

我沒有看到這個代碼有任何問題,除了可能

std::map<std::string, data_base*, order>::const_iterator it

這里的order給出了用於對映射中包含的對進行排序的關鍵比較器(通常實現為樹)。

也許你在做錯了,讓你的[]​​操作符找不到合適的ke,讓你的最后一行記錄一個帶有空ptr的新對。

首先,嘗試沒有該order ,使用默認的key-comparator(std :: less),然后如果它不起作用,發布你的order定義和地圖聲明。 如果還不夠,只需提供一個簡單的完整程序來重現問題。


我剛剛使用默認的key-comparator編寫了一個簡單的類似測試:

#include <map>
#include <string>
#include <iostream>

struct Data 
{ 
    int k; 

    Data* clone() { return new Data(); }
};

typedef std::map< std::string, Data* > DataMap;

DataMap data_map;


int main()
{
    data_map[ "hello" ] = new Data();
    data_map[ "world" ] = new Data();

    DataMap other_map;

    for( DataMap::const_iterator it = data_map.begin(); it != data_map.end(); ++it)
    {
            Data*t = it->second->clone();
            std::cout << "CLONE: " << std::hex << t << std::endl;
            other_map[it->first] = t;
            std::cout << "INSERTED: " << std::hex << other_map[it->first] << std::endl;
    }

    std::cin.ignore();

    return 0;
}

在VS2010SP1上,輸出:

CLONE: 00034DD0
INSERTED: 00034DD0
CLONE: 00035098
INSERTED: 00035098

所以應該是問題,或者你之前做錯了。

試試這個,以幫助調試問題。 我建議仔細檢查order功能是否正確。 您可以將其刪除以使用已知可用的std::less<T>

// ...
typedef std::map<std::string, data_base*, order> string_db_map;
for(string_db_map::const_iterator it = other.elements.begin();
    it != other.elements.end();
    ++it)
{
    data_base *t = it->second->clone();
    std::cout << "CLONE: " << std::hex << t << std::endl;
    std::pair<string_db_map::iterator, bool) result = elements.insert(
        string_db_map::value_type( it->first, t));
    if ( !result.second ) 
    {
        std::cout << "element['" << it->first << "'] was already present, and replaced." << std::endl;
    }
    std::coud << "INSERTED [iterator]: " << std::hex << (*result.first).second << std::endl;
    std::cout << "INSERTED [indexed]: " << std::hex << elements[it->first] << std::endl;
}
// ...

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM