2015-02-24 121 views
1

我試圖找到從下一個迭代器位置到矢量結尾的向量部分中的邊界。使用std :: lower_bound與std :: vector :: const_iterator

的代碼是:

#include <algorithm> 
#include <vector> 
#include <iostream> 

int 
main() 
{ 
    typedef std::vector<int> Vector; 

    Vector v; 
    v.push_back(3); 
    v.push_back(7); 
    v.push_back(15); 
    v.push_back(21); 
    std::sort(v.begin(), v.end()); 
    for (Vector::const_iterator i = v.begin(); i != v.end(); ++i) { 
     Vector::const_iterator low = std::lower_bound(i+1, v.end(), -10-*i); 
     Vector::const_iterator high = std::upper_bound(i+1, v.end(), 10-*i); 
     for (Vector::const_iterator j = low; j != high; ++j) { 
      std::cout << *i << "~" << *j << std::endl; 
     } 
    } 
    return 0; 
} 

不幸的是,std::lower_bound(i+1, v.end(), -10-*i)觸發編譯錯誤,我不明白:

c++ -O3 -ggdb -std=c++11 -W -Wall -pedantic -Wl,-stack_size -Wl,0x1000000 2sum.cc -o 2sum 
2sum.cc:26:26: error: no matching function for call to 'lower_bound' 
       V::const_iterator lo = std::lower_bound(i+1, a.end(), -1... 
             ^~~~~~~~~~~~~~~~ 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:4085:1: note: 
     candidate template ignored: deduced conflicting types for parameter 
     '_ForwardIterator' ('__wrap_iter<const long *>' vs. 
     '__wrap_iter<long *>') 
lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp... 
^ 
/Applications/Xcode.app/Contents/Developer/Toolchains/XcodeDefault.xctoolchain/usr/bin/../include/c++/v1/algorithm:4070:1: note: 
     candidate function template not viable: requires 4 arguments, but 3 were 
     provided 
lower_bound(_ForwardIterator __first, _ForwardIterator __last, const _Tp... 
^ 

什麼是與上面的陳述和問題如何正確地調用std::lower_boundi+1迭代器?

+5

也許* *我們能夠理解的編譯錯誤,如果你碰巧它張貼...... – Angew 2015-02-24 11:15:08

+0

添加錯誤消息。 @jrok在下面給出了正確的答案。 – user4510038 2015-02-24 13:13:02

+0

並解釋錯誤消息:「候選模板被忽略:參數的推導衝突類型」 - 所以存在類型參數問題。 'someType '與'someType ' - 看起來像一個'const'問題。 OMG。 – Angew 2015-02-24 13:17:22

回答

5

錯誤可能表示它不能推斷出模板參數 - iconst_iteratorv.end()返回iterator。這應該做的伎倆:

std::lower_bound(i+1, v.cend(), -10-*i); 
         ^^^^^^^^ 
+0

OMG。 我期望lower_bound能夠將非常量迭代器強制轉換爲const常量。 謝謝! – user4510038 2015-02-24 13:10:08

+0

@ user4510038它確實能夠投射;問題是它必須推導出模板參數類型,並且在那裏發生衝突。如果它知道要使用哪一個,它會投下來就好。 – Angew 2015-02-24 13:18:05