在函数

时间:2015-08-02 06:42:57

标签: c++ dictionary struct

我有以下代码:

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

在功能中填充地图的最佳方法是什么?这种方式是否正确? 结构是在堆栈还是堆上定义的?

3 个答案:

答案 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_uniquestd::make_sharednew(不要使用它)。