根据Google C ++ Style指南,
C / C ++函数的参数既可以是函数的输入,也可以是函数的输出,或者两者兼而有之。输入参数通常是值或const引用,而输出和输入/输出参数将是非const
的指针事实上,Google代码中的一个非常强大的惯例是输入参数是值或const引用,而输出参数是指针。输入参数可以是常量指针
引用应始终保持不变。如果我有一个将要更新的对象向量会发生什么?我应该遵循指南并使用指向矢量?如果对象数据也将更新会发生什么?我应该使用指向对象指针向量的指针,例如的std ::矢量<对象*> *?我觉得这个惯例很奇怪。
我是否误解了它或者这是正确的方法(这意味着这正是导游告诉人们要做的事情)?
答案 0 :(得分:2)
Google样式指南指出,您永远不应该将非const引用作为函数的参数,因为它们需要可以修改的"参数"在电话会议上明确标明。
根据该规则,如果您的函数采用它将修改的数据向量,则必须使用指向它的指针。
另一方面,gsl
(C ++核心指南)提供span<T>
类型,如果您只修改元素而不是向量具有哪些元素,在许多情况下,选择vector<T>*
是一个很好的选择。
如果不是练习,这与谷歌风格指南不同。
哪个是正确的,因此在堆栈溢出时偏离主题。
但是,不要认为只是因为它是&#34; google&#34;的风格指南,它们在某种程度上是完美的。即使他们是完美的谷歌,谷歌也是一家奇怪的公司。对于他们的开发环境来说,完美适用于地球上C ++的大多数开发。答案 1 :(得分:0)
我会说。
1) (几乎总是如此)切勿使用指向矢量的指针。 Vector已经拥有一个指向其数据的内部指针。使用std::move()
让矢量在必要时移动其内部数据。
现在,我发现使用非const引用并没有错。但是,如果您需要避免它们,您可以随时执行此操作:
2)如果您需要更新矢量,您可以移动数据进出功能:
// pass in by value (lets the caller decide to move or copy)
std::vector<int> update_vector(std::vector<int> v)
{
// v.push_back(7);
return v;
}
// ..
std::vector<int> my_vector;
my_vector = update_vector(std::move(my_vector)); // vector is not copied
3)至于更新矢量数据,请避免存储指针,除非需要多态。
std::vector<Object> v;
v.emplace_back(/* Objects's constructor params */);
Object o; // another object
v[0] = std::move(o);
等...