C++ 插入到指向std::map的指针

C++ 插入到指向std::map的指针,c++,map,stl,stdmap,C++,Map,Stl,Stdmap,我在地图中使用地图: std::map<int, std::map<DWORD,IDLL::CClass*>*> *MyMap 稍后在程序中,map已变为空 有人能帮忙吗 拥有原始指针通常是一种不好的做法(除非您在特殊情况下,如您正在构建自定义高级数据结构,并且拥有的原始指针在适当的RAII类边界中受到保护) 第一种选择应该是使用值语义;如果这对您的性能不好,那么您可能希望使用智能指针,如共享\u ptr(这有助于简化代码、确保异常安全、避免资源泄漏等) 这是一个示例可

我在
地图
中使用
地图

std::map<int, std::map<DWORD,IDLL::CClass*>*> *MyMap
稍后在程序中,
map
已变为空

有人能帮忙吗

拥有原始指针通常是一种不好的做法(除非您在特殊情况下,如您正在构建自定义高级数据结构,并且拥有的原始指针在适当的RAII类边界中受到保护)

第一种选择应该是使用值语义;如果这对您的性能不好,那么您可能希望使用智能指针,如
共享\u ptr
(这有助于简化代码、确保异常安全、避免资源泄漏等)

这是一个示例可编译代码,它似乎适用于VS2010 SP1(VC10):

#包含//用于std::cout
#include//for std::map
#包括//用于std::shared_ptr和std::make_shared
使用名称空间std;
typedef无符号整数双字;
结构MyClass
{
MyClass():数据(0){}
显式MyClass(int数据):数据(data){}
int数据;
};
int main()
{
//
//构建一些测试图
//
typedef-map-InnerMap;
typedef映射OuterMap;
auto innerMap1=使_共享();
(*innerMap1)[10]=使_共享(10);
(*innerMap1)[20]=使_共享(20);
OuterMap-myMap;
myMap[30]=innerMap1;
//
//地图访问测试代码
//
常数int keyOuter=30;
自动itOuter=myMap.find(keyOuter);
if(itOuter!=myMap.end())
{
//键出现在外部地图中。
//在内部映射中重复查找。
自动内部映射PTR=itOuter->second;
常数DWORD KEYINERN=20;
自动itInner=innerMapPtr->find(键内);
如果(itInner!=innerMapPtr->end())
{

cout second->Data不使用
std::map MyMap
(没有指针)的原因是什么?@ipc,当值对象不允许复制时?我必须使用许多映射,因此我选择poniters以减少内存use@user2161341:除非有多个指向公共映射的指针,否则使用指针将增加内存使用。由于看起来您为每个指针创建了一个新映射,因此将不会有公共映射。
std::map my\u map
可能更适合您。您可以使用
std::pair
简单地组合这两个键,并在使用指针时停止使用指针。容器通常不需要在堆上声明。
std::map<DWORD,IDLL::CClass*> *SecondMap;
SecondMap= new std::map<DWORD,IDLL::CClass*>; 
DWORD i = 1;
while (eteration on obj type IDLL::CClass ) 
{
     SecondMap.insert(std::make_pair(i,&obj));           
}int j = 1;    


MyMap->insert(std::make_pair(1,&SecondMap));
#include <iostream>     // for std::cout
#include <map>          // for std::map
#include <memory>       // for std::shared_ptr and std::make_shared
using namespace std;

typedef unsigned int DWORD;    

struct MyClass
{
    MyClass() : Data(0) {}
    explicit MyClass(int data) : Data(data) {}

    int Data;
};

int main()
{
    //
    // Build some test maps
    //

    typedef map<DWORD, shared_ptr<MyClass>> InnerMap;
    typedef map<int, shared_ptr<InnerMap>> OuterMap;

    auto innerMap1 = make_shared<InnerMap>();
    (*innerMap1)[10] = make_shared<MyClass>(10);
    (*innerMap1)[20] = make_shared<MyClass>(20);

    OuterMap myMap;

    myMap[30] = innerMap1;


    //
    // Testing code for maps access
    //

    const int keyOuter = 30;
    auto itOuter = myMap.find(keyOuter);
    if (itOuter != myMap.end())
    {
        // Key present in outer map.
        // Repeat find in inner map.

        auto innerMapPtr = itOuter->second;
        const DWORD keyInner = 20;
        auto itInner = innerMapPtr->find(keyInner);
        if (itInner !=  innerMapPtr->end())
        {
            cout << itInner->second->Data << '\n';
        }
    }
}