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';
}
}
}