C++ 哪个更好向地图添加条目的3种方法

C++ 哪个更好向地图添加条目的3种方法,c++,map,vector,C++,Map,Vector,我在sourceFile.cpp中有以下代码function(),并为key1、key2和key3插入条目。然后调用functionB()以使用3个键的向量。我想在退出functionC()后释放所有内存。在三种将条目输入地图的方法中,哪种方法正确/更好 Class ClassA { ... } ClassA *key1 = new ClassA(); ClassA *key2 = new ClassA(); ClassA *key3 = new ClassA(); static map&l

我在
sourceFile.cpp
中有以下代码<首先调用code>function(),并为key1、key2和key3插入条目。然后调用
functionB()
以使用3个键的向量。我想在退出
functionC()
后释放所有内存。在三种将条目输入地图的方法中,哪种方法正确/更好

Class ClassA { ... }

ClassA *key1 = new ClassA();
ClassA *key2 = new ClassA();
ClassA *key3 = new ClassA();

static map<ClassA*, vector<pair<char*, char*> > > stringMap;

// which way of adding an entry into StringMap is better? key1, key2 or key3
void functionA() {
    // insert entries into stringMap for key1 and key2
    vector<pair<char*, char*> > *v1 = new vector<pair<char*, char*> >();
    stringMap[key1] = *v1;
    stringMap[key2]; // map will insert one vector<pair<char*, char*> > object
    // is this vector object on heap or stack?

    vector<pair<char*, char*> > v3;
    stringMap[key3] = v3; // 
}

void functionB() {
    // get entries for key1, key2 and key3
    // use vector.push_back() to populate vectors
}

void functionC() {
    // so when program exits this function, all memory is released
    vector<pair<char*, char*> > *v1 = stringMap[key1];
    v1->clear(); // or loop and v1->erase() 
    stringMap.erase(key1);
    delete v1;

    vector<pair<char*, char*> > v2 = stringMap[key2];
    v2.clear();
    stringMap.erase(key2);
    // v2 was inserted by map, does it need to delete v2 ??? 

    // what about the vector for key3?
}
ClassA{…}
ClassA*key1=新ClassA();
ClassA*key2=新的ClassA();
ClassA*key3=新的ClassA();
静态地图;
//哪种向StringMap添加条目的方式更好?键1、键2或键3
无效函数(){
//将项插入到key1和key2的stringMap中
向量*v1=新向量();
stringMap[key1]=*v1;
stringMap[key2];//map将插入一个向量对象
//这个向量对象是在堆上还是堆栈上?
向量v3;
stringMap[key3]=v3;//
}
无效函数b(){
//获取键1、键2和键3的条目
//使用vector.push_back()填充向量
}
void函数c(){
//所以当程序退出这个函数时,所有的内存都被释放
向量*v1=stringMap[key1];
v1->clear();//或循环和v1->erase()
stringMap.erase(键1);
删除v1;
向量v2=stringMap[key2];
v2.clear();
stringMap.erase(键2);
//v2由map插入,是否需要删除v2???
//那么键3的向量呢?
}

“更好”不是一个可测量的数量。以什么方式更好?功能性、更快、更干净的代码等?通常,最好使用
insert()
。使用
[]
语法将默认创建映射值的副本,然后在中复制该值,这通常效率低下。关于您的问题:无论何时使用“new”,您都是在堆上进行分配。每次使用<代码>新< /代码>时,你应该使用<代码>删除<代码>,或者更好地把“<代码>新< /COD> > ED对象放在智能指针中(<代码>:ST::SyrdYPPTR , STD::UnQuyJPPT)。我真的认为C++从错误的角度接近C++。就好像你发现了一个很酷的新玩具,你把它扔在水泥地上,却不知道它有多脆弱。因此,在以这种方式处理指针和容器之前,需要在C++中进行一些基础工作。我感觉到你知道C,并认为C++神奇地让所有困难的内存都消失了,所以你就跳到了深渊。如果你太深了,你将无法得到有用的答案。@paddy谢谢你的评论。我来自Java世界。我们有一个C++库,并使用JNI进行通信。我们将数据导入C++对象(CyrA)。在C++对象(CyrA)完成其工作之后,还有一些其他java对象和C++对象需要释放。我用MAP存储C++对象(CyrA)指针和java对象和C++对象的向量对。你可以给我一个更好的解决办法。