簡體   English   中英

通過引用傳遞矢量

[英]Passing vector by reference

使用普通的C數組我會做那樣的事情:

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

現在,我想用vector替換標准數組,並在此處獲得相同的結果:

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

但它顯示“表達式必須具有類類型”。 怎么做得好?

您可以通過引用傳遞容器,以便在函數中修改它。 還沒有解決的其他答案是std::vector沒有push_front成員函數。 您可以在vector上使用insert()成員函數進行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);
}

如果你定義你的函數來獲取std::vector<int>& arr和integer值的參數,那么你可以在該函數中使用push_back

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

用法:

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

應該

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

通過引用傳遞已經簡化為在C ++中使用&

您可以通過引用傳遞矢量,如下所示:

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

通過這種方式,您可以添加第一個元素(如果向量為空)或修改其值(如果第一個元素已存在)。

你不需要使用** 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);
}

但同樣沒有理由這樣做......

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM