在c ++中,建议使用指向vector的指针,还是应该总是使用vector to vector?

时间:2017-10-30 04:10:31

标签: c++ pointers vector

根据Google C ++ Style指南,

  

C / C ++函数的参数既可以是函数的输入,也可以是函数的输出,或者两者兼而有之。输入参数通常是值或const引用,而输出和输入/输出参数将是非const

的指针      

事实上,Google代码中的一个非常强大的惯例是输入参数是值或const引用,而输出参数是指针。输入参数可以是常量指针

引用应始终保持不变。如果我有一个将要更新的对象向量会发生什么?我应该遵循指南并使用指向矢量?如果对象数据也将更新会发生什么?我应该使用指向对象指针向量的指针,例如的std ::矢量<对象*> *?我觉得这个惯例很奇怪。

我是否误解了它或者这是正确的方法(这意味着这正是导游告诉人们要做的事情)?

2 个答案:

答案 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);

等...