簡體   English   中英

為向量分配一個元素向量

[英]allocate an element vector to vector

這是我寫的段函數:

vector<int> v1(const vector<int> &v2, const vector<int> &v3) {

  int v2_index = 0;
  int v3_index = 0;
  int v1_INDEX = 0;

  for(int i=0; i < v3.size(); ++i) {
    if(v2[v2_INDEX] == v3[v3_INDEX]) {
       int  x= v2[v2_INDEX];
       v1[v1_INDEX] = x;
       ++v1_INDEX;
     }
     if (v2[0] != v3[0]) {
       v2_INDEX++;
     }
     v3_INDEX++;
   }
}

我必須使用向量作為函數。 如果 v2 元素等於 v3 元素,我想為 v1 向量分配一個元素(不重復;push_back 或 v2[0]= v1[0]):

我試過了:

v1.push_back(v2.push_back(i));
v1[v1_INDEX] = v2[v2_index];
int x = v2[v2_index]; v1.push_back(x);
v1[v2[v2_index]];

他們都沒有編譯。 為什么我可以在不使用額外庫的情況下將元素 v2[i] 正確分配給 -----> v1[i]?

我收到以下錯誤:

error: request for member ‘push_back’ in ‘v1’, which is of non-class type 

問題的關鍵在於,在 C++ 中,與Pascal不同,函數通過使用return語句返回值。 在 C++ 中,不可能通過函數名訪問返回的對象。 在您的代碼中:

   v1[v1_index] = x;

v1指的是函數本身,而不是返回的對象。 因此,代碼嘗試訪問函數v1是它是數組還是向量。 這是沒有意義的,因此錯誤:

<source>: In function 'std::vector<int> v1(const std::vector<int>&, const std::vector<int>&)':
<source>:12:19: warning: pointer to a function used in arithmetic [-Wpointer-arith]
        v1[v1_index] = x;
                   ^

要獲得您想要的功能,您需要定義返回的對象,並在最后返回它:

vector<int> v1(const vector<int> &v2, const vector<int> &v3) {

  int v2_index = 0;
  int v3_index = 0;
  int v1_index = 0;

  vector<int> ret;
  for(int i=0; i < v3.size(); ++i) {
    if(v2[v2_index] == v3[v3_index]) {
       int  x= v2[v2_index];

       // Bug: out of bounds
       ret[v1_index] = x;
       ++v1_index;
     }
     if (v2[0] != v3[0]) {
       v2_index++;
     }
     v3_index++;
   }
   return ret;
}

這可以編譯,但您仍然有一個嚴重的錯誤。 該錯誤正在訪問ret越界。 更好的解決方案是v1_index並簡單地調用push_back()代替:

   int  x= v2[v2_index];
   ret.push_back(x);

更好的是,使用 range-for 循環代替v3_index變量的所有混亂。 它很簡單:

for (auto v3_element: v3) {
  ... your code goes here...
}

無需維護索引,也無需訪問v3[...] 這一切都由for為您完成。 不幸的是,由於v2_index遞增的方式,您無法擺脫它,但不需要其他索引變量。

暫無
暫無

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

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