2014-07-15 136 views
1

我正在学习C++,并且遇到了此函数的问题。我最初传递了整个向量,然后传递了一个指向该向量的指针;但是我似乎无法从指向矢量的指针赋值。填充矢量<int> *

void fill(std::vector<int> *vec, const int startVal) 
{ 
    const int n = vec->size(); 
    for (int i = 0; i < n; ++i) 
    { 
     vec[i] = startVal + i 
    } 
} 

我该如何在指针(vec)的第i个位置赋值给vector?

我想:

vec->[i] = startVal + i; 
+4

'(* vec)[i]'会起作用。但为什么传递一个指针?通过一个参考,或两个迭代器。 – juanchopanza

+0

@juanchopanza:他可能会遵循[_Google C++风格指南_](http://google-styleguide.googlecode.com/svn/trunk/cppguide.xml#Reference_Arguments):) _“所有通过引用传递的参数都必须标记'const'。“_ –

+1

@C64先生,我已经忘记了那些废话:-)我真的很希望没有人真正遵循这一点。 – juanchopanza

回答

8

那么,你应该通过引用传递的载体:

void fill(std::vector<int> &vec, int startVal) 

那么你一定要会行:

vec[i] = startVal + i; 

当你正在使用一个指针,你必须解引用指针,所以:

(*vec)[i] = startVal + i; 
4

你可以去参考指针这样的:

(*vec)[i] 

vec->operator[](i) 

,但你可以让你的生活通过传递一个参考更容易,

void fill(std::vector<int>& vec, int startVal) 

或调用std::iota,这是一个标准库算法,实现您的混淆功能命名为fill功能:

std::vector<int> v = ....; 
.... 
std::iota(v.begin(), v.end(), startVal); 
+0

有没有什么方法可以使用'iota',而是在你去时创建元素,而不是分配给默认构造的元素? –

+0

@MattMcNabb不幸的不是。除了传递结束迭代器之外,没有办法指定范围的结尾。有一个'iota_n'类型的函数会很好。 – juanchopanza

+0

@MattMcNabb你可以使用generate_n,但我不知道它是否保证线性顺序。 –