24

使用普通的 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
}

但它显示“表达式必须具有类类型”。如何正确执行此操作?

4

5 回答 5

35

您可以通过引用传递容器,以便在函数中对其进行修改。其他答案没有解决的是std::vector没有push_front成员函数。您可以使用insert()成员函数 onvector进行 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);
}
于 2013-04-08T23:24:55.013 回答
20

如果您将函数定义为采用参数 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); 
于 2013-04-08T22:55:10.943 回答
8
void do_something(int el, std::vector<int> **arr)

应该

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

通过引用传递已被简化为&在 C++ 中使用。

于 2013-04-08T22:53:38.313 回答
3

您可以像这样通过引用传递向量:

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

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

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

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;
    }
}

通过这种方式,您可以添加第一个元素(如果向量为空)或修改其值(如果第一个元素已经存在)。

于 2013-04-08T23:15:54.383 回答
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);
}

**arr 没有意义,但如果您坚持使用它,请这样做:

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

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

于 2013-04-08T22:55:28.567 回答