簡體   English   中英

帶有std :: begin(),std :: end()問題的C ++ 11 auto迭代器類型

[英]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 autostd::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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM