c ++ - 通过引用传递map <int,vector =“”>

时间:2015-11-18 00:39:21

标签: c++

我想通过引用函数传递一个映射,以便函数可以修改它。函数创建并返回此映射也是可以接受的,因为它不会返回任何其他内容,但是引用传递似乎更容易。我不确定为什么在遵循本文c++ pass a map by reference into function

中的建议时出现以下错误

错误:

error: invalid initialization of non-const reference of type ‘std::map<int, std::vector<double> >&’ from an rvalue of type ‘std::map<int, std::vector<double> >*’

我的伪代码

void func(std::map<int, vector<double> > &my_map)
{
     /* do stuff with my_map */
}

int main()
{
std::map<int, vector<double> > specific_map;
func(&specific_map);
}

有什么想法吗?

1 个答案:

答案 0 :(得分:3)

使用*而非&定义您的热门功能。 *表示变量是指针,&(在您调用函数的上下文中)表示“给我这个变量的地址。所以,你想存储你的地址指针中的变量,因此希望您的函数采用指针(*)并且您想要传递一个地址(&):

这称为通过指针传递。我们创建的函数接受一个指向map(*)的指针,当我们调用该函数时,我们正在为我们的map创建一个指针(&amp;):

void func(std::map<int, vector<double> > *my_map) // accept a pointer *
{
     /* do stuff with my_map */
}

int main()
{
std::map<int, vector<double> > specific_map;
func(&specific_map); // pass a copy of where specific_map exists in memory &
}

在你的第一个函数中你不能使用点符号。您将不得不使用箭头表示法。这意味着您必须my_map->size()而不是my_map.size()

或者,您可以通过引用传递地图。这是c ++中的一个“新”功能,可以说更具可读性(并且可以说)更容易理解:

void func(std::map<int, vector<double> > &my_map)
{
     /* do stuff with my_map */
}

int main()
{
std::map<int, vector<double> > specific_map;
func(specific_map);
}

并且您可以像往常一样使用点符号my_map.size(),但这仍然是原始地图的参考。请注意,在第二种情况下,调用者不必提供对变量的引用,而只需提供变量本身,但我们仍然通过引用传递。通过引用传递,不会创建初始变量指针的副本,因此您对变量WILL的更改会影响局部变量(这样可以节省开销)。