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::vectorpush_frontメンバー関数がないことです。O(n) 挿入にはinsert()メンバー関数 onを使用できます。vector

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 に答える
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 に答える