gpt4 book ai didi

c++ - 在函数中调用结构的构造函数,C++

转载 作者:行者123 更新时间:2023-11-30 00:38:08 25 4
gpt4 key购买 nike

这是我的问题的大概代码。首先,我们有一个带有构造函数的结构:

struct Pair{
Pair(int a, int b): (first (a) , second (b) ) {}
int first;
int second;
};

在 map 中使用

map<string, Pair> mymap;

我想在一个函数中初始化这个 map

void f(map<string, Pair>* mymap, string c,int x, int y )
{
(*mymap)[c]=Pair(x,y);
}

但是编译器首先说它找不到合适的构造函数,然后接下来的几行是没有为构造函数提供足够的参数。

我的一个 friend 告诉我,我应该这样写函数:

void f(map<string, Pair>& mymap, const string& c,int x, int y )
{
if (mymap.find(c) != mymap.end()) {
mymap[c] = Pair(x,y);
}
}

但是他无法解释为什么这里要用Type&而不是Type *,我想澄清这一点。 可以有人解释一下吗?

最佳答案

问题是 map 中的 operator[] 要求值类型是默认可构造的。如果您不希望您的 Pair 是默认可构造的,则必须避免使用 operator[]:

void f(map<string, Pair>& mymap, string c,int x, int y )
{
mymap.insert( std::make_pair(c,Pair(x,y)) );
}

您可能误解了 friend 的建议。 operator[] 的问题不在于它需要默认构造函数如果它需要创建一个新元素,而是它需要它以防它可能需要到。也就是说,该元素是否预先存在并不重要。


如果您还想更新,那么您还需要考虑该选项:

void f(map<string, Pair>& mymap, string c,int x, int y )
{
auto res = mymap.insert( std::make_pair(c,Pair(x,y)) );
if ( !res.second )
res.first->second = Pair(x,y);
}

基本上,insert 操作返回一对指向键的迭代器和一个 bool 值,指示此 insert 是否创建了对象,或者它是否已经存在(其中如果 map 中的值未修改)。通过存储结果,我们可以测试,如果 insert 没有创建值,我们可以通过返回的迭代器更新它。

关于c++ - 在函数中调用结构的构造函数,C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11691416/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com