![](/img/trans.png)
[英]Why are std::begin() and std::end() overloaded for std::initializer_list in C++11?
[英]C++11 auto iterator type with std::begin(), std::end() issue
我有一些私有類成員,表示包含一些數據的std::deque
隨機訪問數組:
std::vector<std::deque<SomeDataClass> > someMember;
我想提供一個公共類方法,它返回可迭代的數據結構,包含我的deques數組中的所有數據元素:
std::deque<SomeDataClass> someMethod();
我希望這個方法遍歷vector中的所有deques並復制它上面的每個元素到本地std :: deque,最終按值返回本地std :: deque。 我正在嘗試使用C ++ 11 auto
和std::begin()
, std::end()
實現此方法:
std::deque<SomeDataClass> MyClassName::someMethod(){
std::deque<DirectedEdge> allDataItems;
std::deque<DirectedEdge>::iterator deqIter = allDataItems.begin();
for(auto it = std::begin(someMember); it != std::end(someMember); ++it){
std::copy(std::begin(*it), std::end(*it), deqIter);
}
return allDataItems;
}
我在deque標頭中的運行時收到數據訪問沖突未處理的異常錯誤。 什么是錯誤?
std::copy()
要求目標范圍足夠大以容納副本,但allDataItems
為空。 您必須提前在allDataItems
中保留空間(但這對於std::deque
不可能的)。 您應該使用std::back_inserter
(在<iterator>
定義):
std::deque<SomeDataClass> MyClassName::someMethod(){
std::deque<DirectedEdge> allDataItems;
for(auto it = std::begin(someMember); it < std::end(someMember); ++it){
std::copy(std::begin(*it), std::end(*it), std::back_inserter(allDataItems));
}
return allDataItems;
}
這是一個習慣性的C + 11方法:
std::deque<SomeDataClass> MyClassName::someMethod() {
std::deque<DirectedEdge> allDataItems;
for( auto const& dq : someMember ) {
allDataItems.insert( allDataItems.end(), std::begin(dq), std::end(dq) );
}
return allDataItems;
}
另一種方法是編寫一個concatinate
函數:
struct concatenate {
template<typename Dest, typename Src>
Dest&& operator()( Dest&& d, Src const& s ) const {
using std::begin; using std::end;
typename std::decay<Dest>::type retval = std::forward<Dest>(d);
retval.insert( end(retval), begin(s), end(s) );
return std::move(retval);
}
};
std::deque<SomeDataClass> MyClassName::someMethod() {
using std::begin; using std::end; // enable ADL
return std::accumulate(
begin(someMember), end(someMember),
std::deque<DirectedEdge>(), concatenate()
);
}
這很可愛。 如果你不喜歡std::accumulate
,
std::deque<SomeDataClass> MyClassName::someMethod() {
std::deque<DirectedEdge> allDataItems;
for( auto const& dq : someMember ) {
allDataItems = concatenate( std::move(allDataItems), dq );
}
return allDataItems;
}
這兩者大致相當有效。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.