我有以下代码:
mystruct
{
std::string str;
int x;
}
void main()
{
std::map<int, mystruct> mymap;
func(mymap);
}
void func(std::map<int, mystruct>& mmap)
{
mmap[1].str = "bla";
mmap[1].x = 5;
}
在功能中填充地图的最佳方法是什么?这种方式是否正确? 结构是在堆栈还是堆上定义的?
答案 0 :(得分:1)
为什么您的代码不是有效的可编译C ++代码有很多原因。我已尝试在下面的示例中修复它们,但除此之外我无法看到您的方式有任何特别的错误。
在C ++ 11中,您可以使用初始化列表初始化map
。另外,如果您正在初始化新的map
,那么使用返回值而不是引用参数会更加惯用:
#include <map>
#include <string>
struct mystruct
{
std::string str;
int x;
};
std::map<int, mystruct> func()
{
return {{1, {"bla", 5}}};
}
int main()
{
auto myMap = func();
}
map
将动态地为元素分配内存,因此结构将位于&#34;堆&#34;。
答案 1 :(得分:0)
嗯,这将是一种常见的最低下降方式。并且不用担心解除分配或堆积。
#include <map>
#include <iostream>
using namespace std;
struct mystruct
{
std::string str;
int x;
mystruct(int xx, string s) : x(xx), str(s){}
mystruct() {}
};
void func(std::map<int, mystruct>& mmap, int k, mystruct v)
{
auto itr = mmap.begin();
if ((itr = mmap.find(k)) == mmap.end())
{
mmap.insert(pair<int, mystruct>(k, v));
}
else
{
mmap[k] = v;
}
}
int main()
{
std::map<int, mystruct> mymap;
mystruct s(5, "bla");
func(mymap, 1, s);
// look up
if (mymap.find(1) != mymap.end())
{
cout << "found";
}
else
{
cout << "not found";
}
return 0;
}
答案 2 :(得分:0)
如果func
是要将元素添加到可能已包含元素的现有地图中,并且不应删除这些元素,则这是最佳方式:
void func(std::map<int, mystruct>& mmap)
{
mmap[1] = { "bla", 5 };
}
否则,如果func
只是填充(初始化)一个空映射,那么这是最好的方法(前提是你至少使用C ++ 11, move 返回值):
std::map<int, mystruct> func()
{
std::map<int, mystruct> mmap;
mmap[1] = { "bla", 5 };
return mmap;
// you could also use list initialization here as shown in Chris Drew's answer
}
和
auto mymap = func();
在这两种情况下,mmap
都在堆栈中。将它放在堆上需要调用std::make_unique
,std::make_shared
或new
(不要使用它)。