Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/138.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 如何在C++;?_C++_Pointers_Initialization_Destructor_Stdmap - Fatal编程技术网

C++ 如何在C++;?

C++ 如何在C++;?,c++,pointers,initialization,destructor,stdmap,C++,Pointers,Initialization,Destructor,Stdmap,如果我们创建一个映射,我们可以清除它,但它仍然保留在内存中,对吗?例如 #include <map> using namespace std; int main(){ map<int,int> myMap; myMap[1] = 2; myMap.clear(); return 0; } 取消注释myMap[1]=2行以错误结束: alvas@ubi:~$g++test.cpp test.cpp:在函数“int main()”中: test

如果我们创建一个
映射
,我们可以清除它,但它仍然保留在内存中,对吗?例如

#include <map>
using namespace std;

int main(){

    map<int,int> myMap;
    myMap[1] = 2;
    myMap.clear();

return 0;
}
取消注释
myMap[1]=2行以错误结束:

alvas@ubi:~$g++test.cpp test.cpp:在函数“int main()”中: test.cpp:8:14:错误:与“operator=”不匹配(操作数类型为“std::map”和“int”) myMap[1]=2; ^ 在/usr/include/c++/5/map:61:0中包含的文件中, 来自测试。cpp:2: /usr/include/c++/5/bits/stl_-map.h:296:7:注:候选者:std::map&std::map::operator=(const std::map&)[with _Key=int;_Tp=int;_Compare=std::less;_Alloc=std::allocator>] 运算符=(常量映射和x) ^ /usr/include/c++/5/bits/stl_-map.h:296:7:注意:参数1从'int'到'const-std::map&'的转换未知

如何在C++中破坏<代码>映射< /代码>?它是“可破坏的”吗

另外,如何初始化/填充
映射
指针的值

如何在C++中破坏一个映射?< /P> 当您将它声明为对象时(第一种情况),当它超出范围时,它将被销毁

当声明为指针时,
delete
关键字在使用
new
时起作用。如果使用智能指针,则无需显式调用
delete

如何初始化/填充映射指针的值

使用如下方法:

#include <map>
using namespace std;

int main(){

    map<int,int> *myMap = new map<int,int>;
    myMap->insert(make_pair<int, int>(1, 2));
    delete myMap;

return 0;
}
#包括
使用名称空间std;
int main(){
map*myMap=新地图;
myMap->insert(生成配对(1,2));
删除myMap;
返回0;
}
或者,正如@Michael所建议的,您可以使用
(*myMap)[1]=2但我更喜欢使用API


注意:正如注释中所指出的,对于
std::map
而言,和
insert()
在行为上并不相似。只是在这个最小的示例中,它们没有反映任何差异。

有几种方法可以释放
std::map
正在使用的内存(达到其初始最小值),而无需使用指针

首先是惯用的clear and minimize(交换),即创建一个空的临时映射,并将其内容与工作映射交换:

std::map<int,int>().swap(myMap); // memory reset to minimum
如果必须使用指针(最好避免),则需要使用
*
取消对指针的引用,如下所示:

(*myMap)[key] = value;

(*myMap)[1]=2new
,code>会起作用。其余部分在CinCout答案中,如下所示:名称原因
int*i=new int(0);i+=5;删除i
不会将5添加到
int
“如果我们创建
映射
,我们可以清除它,但它仍保留在内存中,对吗?”映射管理对象本身会这样做(可能是一个或二十多个字节,这取决于您是编译32位还是64位应用程序,以及
map
实现是否添加了数据以支持调试)但是
地图
用来存储的数据元素的内存将被应用程序释放以供重用。总之,在
地图
上进行
清除
是非常不值得的。这与
向量
形成了鲜明对比,后者倾向于保留存储元素的内存。走第一条路。当你当你清除一张地图时,它的内容就消失了。它占用的存储空间不会比指向它的指针多(好吧,也许只是多一点)。不要不必要地使您的代码复杂化。您有15K代表。您应该知道一次只问一个问题。^在这种情况下,这会产生什么影响?如果忽略关键细节,您的回答表明它们是等效的,而不是等效的。
int func()
{
    { // <- start an internal scope for the map

        std::map<int,int> myMap;

        // use the map

    } // <- let the map go out of scope when done using it

    // carry on without the map
}
(*myMap)[key] = value;