我對使用std::map容器呼叫std::adjacent_difference. 對于檔案adjacent_difference說,有關定義自定義操作如下:
op - 將應用的二元運算函式物件。
該函式的簽名應等同于以下內容:
Ret fun(const Type1 &a, const Type2 &b);
簽名不需要有 const &。型別 Type1 和 Type2 必須使得型別為 iterator_traits::value_type 的物件可以隱式轉換為兩者。Ret 型別必須使得 OutputIt 型別的物件可以被取消參考并分配一個 Ret 型別的值。
所以在下面的代碼(片段)中,我有一個 lambda,它回傳一個整數到最終容器,以保存映射中存盤的值之間的差異。
std::map<char, int> m;
// Do stuff to initialize map contents here
// ...
std::vector<int> d;
typedef std::pair<char, int> P;
std::adjacent_difference(m.begin(), m.end(), std::back_inserter(d),
[](const P & a, const P & b)->int { return std::abs(a.second - b.second);}
);
我得到一些錯誤,顯然是指在一對和一個整數之間進行的無效分配。不是我如何解釋檔案,我不確定我錯過了什么。我認為檔案很清楚地說 lambda 的回傳值被分配給結果容器,但顯然這不是發生了什么?
/usr/local/include/c /8.3.0/bits/stl_numeric.h:374:17: error: no match for ‘operator=’ (operand types are ‘std::back_insert_iterator<std::vector<int> >’ and ‘_ValueType’ {aka ‘std::pair<const char, int>’})
*__result = __value;
~~~~~~~~~~^~~~~~~~~
我有沒有在其他地方越過電線?
uj5u.com熱心網友回復:
研究您提供的 cppreference 鏈接表明std::adjacent_difference()無法將其輸出轉換為與輸入不同的型別:
acc(累加值)和 val - acc 或 op(val, ACC) <...> 的結果都必須可寫到 OutputIt。
因此,要使用演算法,您首先需要std::transform()將地圖轉換為std::vector<int>,然后再使用std::adjacent_difference()。但是手動回圈可能更有意義。
轉載請註明出處,本文鏈接:https://www.uj5u.com/houduan/409380.html
標籤:
