[英]compare nested iterators after boost transformed()
vector<vector<int>> input{ { { 1, 2 },{ 3, 4 } } };
auto result = input | boost::adaptors::transformed([](const auto& _) {return _; });
result.begin()->begin() == result.begin()->end();
如果我使用_ITERATOR_DEBUG_LEVEL=2
運行此w / VS2015, _ITERATOR_DEBUG_LEVEL=2
在_Compat(const _Myiter& _Right)
觸發此錯誤:
_DEBUG_ERROR("vector iterators incompatible");
這很重要,因為Flattening迭代器在advance_past_empty_inner_containers()
使用此比較。
這是怎么回事? 我如何解決它?
這將返回_
: [](const auto& _) {return _; }
[](const auto& _) {return _; }
。
我沒有查看代碼,但是如果迭代器在每個解除引用上應用轉換,那么我就不會感到驚訝,這意味着每次取消引用result.begin()
(使用->
)時,您都會獲得不同的副本矢量。 迭代器分成不同的向量是不可比的。
無論這個代碼試圖比較地址的行為如何,我都想初始化一個迭代器vector<vector<int>>::iterator
來簡化比較存儲在第一個子集中的第一個和最后一個值的過程,最后一個應該是使用->rbegin()
或->end()-1
來代替->end()
,它會帶來未分配的內存跨度。
讓我重新填充你的數組, vector<vector<int>> input{ { { 1, 2 },{ 3, 1 } } };
你要么做其中一個:
assert(*(result.begin()->begin()) == *(result.begin()->end() - 1));
assert(*(result.begin()->begin()) == *(result.begin()->rbegin()));
兩者都拋出異常,因為1 = / = 2
嘗試這個:
assert(*(result.begin()->begin()) == *((result.end() - 1)->end() - 1));
它沒有,因為最重要的是等於forelast存儲的整數。
如果有其他事情沒有在這里談到或者沒有清楚地理解,請告訴我。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.