通过指针或引用将映射传递给函数?

Posted

技术标签:

【中文标题】通过指针或引用将映射传递给函数?【英文标题】:Passing maps to functions via pointers or reference? 【发布时间】:2018-09-18 13:31:43 【问题描述】:

我有以下问题: 当通过值或 const 引用传递时,将映射(或向量等)传递给 C++ 中的函数的正确方法不是一种选择,因为映射必须在函数内进行更改,并且更改也应该在外部看到功能?

我的函数test1 导致分段错误 11. 这是因为指针显然没有携带任何大小信息吗?

函数 test2 可以正常工作,但 flymake-google-cpplint 说“这是一个非常量引用吗?如果是,请使用 const 或使用指针”。

#include <iostream>
#include <map>
using namespace std;

void test1(map<int, int> *memo) 
  auto it = memo->find(1);


void test2(map<int, int> &memo) 



int main() 

  map<int, int> *memo;
  memo->insert(make_pair(1,1));

  return 0;

您会推荐什么解决方案?

非常感谢

M

【问题讨论】:

引用传递有什么问题? 你可以做任何一个,通过引用传递只是让事情更容易阅读(通常)。也许这只是个人喜好,但我也更喜欢只输入 .-&gt; 除非你希望能够有一个空参数,更喜欢通过引用传递。 这似乎是关于 Google C++ 样式指南的问题,而不是 C++ 问题。如果需要,采用非const 引用参数没有任何问题。 未初始化的指针 == 未定义的行为。 【参考方案1】:

首先你的代码有错误。

map<int, int> *memo;

永远不会被初始化,这就是你得到分段错误的原因。你真正想要的是跳过指针

map<int, int> memo;

并通过引用或指向对象的指针 (test1(&amp;memo);) 传递对象。

您从 flymake-google-cpplint 收到警告的原因是因为非常量引用的使用使得不清楚对象是否会发生变异(更改),请参阅 here了解更多信息。

我会忽略来自 flymake-google-cpplint 的警告并使用非常量引用。这主要是一个主观的事情,只要您坚持使用const,您的功能的预期用途应该是明确的。

【讨论】:

【参考方案2】:

您尝试插入指向map&lt;int, int&gt;的未初始化指针

map<int, int> *memo;
memo->insert(make_pair(1,1));

通过引用传递,没有错。

【讨论】:

以上是关于通过指针或引用将映射传递给函数?的主要内容,如果未能解决你的问题,请参考以下文章

Javascript 是不是通过引用或值将数组传递给函数?

C++ 通过引用传递向量字符指针

通过值或常量引用传递给函数?

将 lambda 作为参数传递 - 通过引用或值?

C 传递和指针

将const引用/指针传递给类进行存储的首选方法,而不是复制引用的对象