参照

2013-04-08 43 views
13

传递载体使用普通的C数组我会做这样的事情:参照

void do_something(int el, int **arr) 
{ 
    *arr[0] = el; 
    // do something else 
} 

现在,我想替换标准阵列载体,并获得相同的结果这里:

void do_something(int el, std::vector<int> **arr) 
{ 
    *arr.push_front(el); // this is what the function above does 
} 

但它显示“表达式必须有类型”。如何正确地做到这一点?

+0

''INT ** arr''? ?如何直接分配2d数组?如果你需要二维数组,''foo(vector &arr)''。 – gongzhitaao 2013-04-08 22:54:48

+1

我想他可能是想传递一个指向数组而不是二维数组的指针。纠正我,如果我错了 – Mppl 2013-04-08 23:00:37

+0

很多答案,但没有人注意到它是一个指针数组,而不是指向数组的指针。他们想要一个'std :: vector '。 – 2013-04-08 23:20:51

回答

7
void do_something(int el, std::vector<int> **arr) 

应该是

void do_something(int el, std::vector<int>& arr) 
{ 
    arr.push_back(el); 
} 

通行证通过参考已被简化以使用在C++ &

+0

@taocp,你的意思是'通过引用被简化为使用&在C++中。'? – gen 2016-04-18 09:30:57

+1

@gen这是不好的措辞imho。在C++中真正改变的是它实际上具有传递参考_at all_。 C没有。它通过传递指针实现了相同的结果,并且裁定改变指针取消引用的结果会在原始位置修改指向的值(不是临时副本)。但这不是传递参考。指针是按值传递的。 – 2016-07-04 20:46:47

9

如果你定义功能采取的std::vector<int>& arr和整数值参数,那么你可以使用push_back该函数内部:

void do_something(int el, std::vector<int>& arr) 
{ 
    arr.push_back(el); 
    //.... 
} 

用法:

std::vector<int> arr; 
do_something(1, arr); 
1

你并不需要使用** arr,您可以使用:

void do_something(int el, std::vector<int> *arr){ 
    arr->push_back(el); 
} 

或:

void do_something(int el, std::vector<int> &arr){ 
    arr.push_back(el); 
} 

**改编是没有意义的,但如果你坚持使用它,这样来做:

void do_something(int el, std::vector<int> **arr){ 
    (*arr)->push_back(el); 
} 

但同样也没有理由这样做...

+3

矢量没有'push_front'。 – Rapptz 2013-04-08 23:31:43

3

你可以通过引用传递就像这个载体:

void do_something(int el, std::vector<int> &arr){ 
    arr.push_back(el); 
} 

但是请注意,此F通常在向量的后面处添加一个新元素,而你的数组函数实际上是修改第一个元素(或初始化它的值)

为了达到完全相同的结果,你应该写:

void do_something(int el, std::vector<int> &arr){ 
    if (arr.size() == 0) { // can't modify value of non-existent element 
     arr.push_back(el); 
    } else { 
     arr[0] = el; 
    } 
} 

这样你要么添加的第一个元素(如果向量是空的),或者修改它的值(如果有第一个元素已经存在)。

25

您可以通过引用传递容器以便在函数中对其进行修改。其他答案还没有解决的是std::vector没有push_front成员函数。您可以使用insert()成员函数上vector为O(n)的插入:

void do_something(int el, std::vector<int> &arr){ 
    arr.insert(arr.begin(), el); 
} 

或者使用std::deque而不是为摊销O(1)插入:

void do_something(int el, std::deque<int> &arr){ 
    arr.push_front(el); 
}