2015-06-27 74 views
1
#include <bits/stdc++.h> 
using namespace std; 

int main() { 
int t; 
cin >> t; 
for (int i = 0; i < t; ++i) { 
    int n, m; 
    cin >> n >> m; 
    long int ar[n]; 
    for (int j = 0; j < n; ++j) cin >> ar[j]; 
    vector<long> v(ar, ar+n); 
    sort(v.begin(), v.end()); 
    for (int k = 0; k < m; ++k) { 
     long b; 
     cin >> b; 
     if (binary_search(v.begin(), v.end(), b)) cout << "YES" << endl; 
     else { 
      vector<int>::iterator it; 
      it=lower_bound(v.begin(), v.end(), b); 
      v.insert(it-v.begin(), b); 
      cout << "NO" << endl; 
     } 
    } 
} 
return 0; 
} 

編譯器示出了錯誤,在 '它= LOWER_BOUND(______)' 和 '(它-v.begin()中,b)'。 我無法理解。請幫我整理一下。使用 'LOWER_BOUND'

[Error] no match for 'operator=' (operand types are 'std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}' and '__gnu_cxx::__normal_iterator<long int*, std::vector<long int> >') 

[Error] no match for 'operator-' (operand types are 'std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}' and 'std::vector<long int>::iterator {aka __gnu_cxx::__normal_iterator<long int*, std::vector<long int> >}') 
+0

什麼是錯誤信息? –

回答

1

使用錯誤消息可以更容易地找到錯誤。

[Error] no match for 'operator=' (operand types are 'std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, std::vector<int> >}' and '__gnu_cxx::__normal_iterator<long int*, std::vector<long int> >') 

您的類型不匹配。一個迭代器變成vector<int>另一個變成vector<long>。見:

vector<long> v(ar, ar+n); // the vector you declare. 

vector<int>::iterator it; // the iterator you want to save the element location in. 

你必須在這裏決定一種類型。你有intlong的嗎?您的電話insert也有點不對。第一個參數不應該像你想象的那樣是一個索引,它應該是你想插入它的位置的迭代器。因此,只要把它想:

v.insert(it, b); // we don't have to subtract `v.begin()`. 

去了一遍睡覺之後,這裏有一些補充意見。

cin >> n >> m; 
long int ar[n]; 

在這裏你看從輸入數組的大小。這是一個編譯器擴展,它不是標準的C++。數組在C++編譯時必須知道它們的大小。改爲使用std::vector。反正你已經使用它了。

long int ar[n]; 
for (int j = 0; j < n; ++j) cin >> ar[j]; 
vector<long> v(ar, ar+n); 

正如你使用std::vector無論如何,不​​需要陣列。特別是因爲它正在使用像我上面所說的編譯器擴展。更改爲

vector<long> v(n); 
for (int j = 0; j < n; ++j) cin >> v[j]; 

最後但並非最不重要的是使用更好的變量名稱。所有變量都是1或2個字符。這使得很難遵循代碼,即使是相對較少的代碼,一旦變得更大,就變得非常糟糕。沒有理由在C++中使用這些簡短的變量名稱,使用更長和描述性的變量名稱。

+1

我想添加兩件事:第一個是分割變量聲明('vector :: iterator it;')並給它賦值的壞習慣'it = lower_bound(...);' ),那些應該合併。此外,在C++ 11中,它應該是'auto it = lower_bound(...);'。 –