我需要存儲Base類型的對象以及派生類型BaseDerivedA和BaseDerivedB。這些對象需要在內存中對齊。我想提供一個遍歷所有對象的迭代器。我想避免存儲基本指針向量的內存開銷。對基類型和/或從基類派生的類型的向量進行迭代
爲此我已經建立了以下容器
struct Container {
std::vector<Base> bases;
std::vector<BaseDerivedA> derivedAs;
std::vector<BaseDerivedB> derivedBs;
// Iterator over the three vectors
all_iterator<Base> all_begin(){ return all_iterator(bases[0],this); }
all_iterator<Base> end_begin(){ return all_iterator(nullptr,this); }
// Where all_iterator is defined as
template < class T >
struct all_iterator
: public boost::iterator_facade< all_iterator<T>,
T, boost::forward_traversal_tag>
{
all_iterator() : it_(0) {}
explicit all_iterator(T* p, Container* c) // THIS JUST FEELS WRONG
: it_(p), c_(c) { }
private:
friend class boost::iterator_core_access;
T* it_;
Container* c_;
void increment() {
if (it_ == static_cast<T*>(&(c_->bases[c_->bases.size()-1]))) {
it_ = static_cast<T*>(&(c_->derivedAs[0]));
} else if (it_ == static_cast<T*>(&(c_->derivedAs[ds_->derivedAs.size()-1]))) {
it_ = static_cast<T*>(&(c_->derivedBs[0]));
} else if (it_ == static_cast<T*>(&(c_->derivedBs[ds_->derivedBs.size()-1]))) {
it_ = nullptr; // THIS DOES ALSO FEEL WRONG
} else {
++it_;
}
}
bool equal(all_iterator const& other) const {
return this->it_ == static_cast<T*>(other.it_);
}
T& dereference() const { return *it_; }
};
我使用的是nullptr作爲一個過去的最末端迭代器以及很多演員。我還將我的迭代器傳遞給數據結構的指針。
是否有更好的方法來迭代三個向量包含基類型或基類派生?
你隱藏了大部分重要的代碼,例如什麼是'all_iterator'(它是如何定義的?)以及它如何使用它的參數。你的代碼的當前實現(不管'all_iterator')如何展現未定義的行爲:你不能訪問derivedBs [derivedBs.size()],因爲這是一個超越結尾的元素。 – 2012-07-23 14:13:00
「我不能認爲derivedBs結尾的人不會是derivedAs的第一個元素。」 - 這是爲什麼?這是什麼意思,考慮到不同容器的迭代器是不可比較的? – AnT 2012-07-23 14:23:05
儘管如此,該代碼展現出未定義的行爲,這意味着所有投注都關閉。該方法是不正確的,你應該嘗試找到一個*解決方案*,而不是試圖找到如何使未定義的行爲工作。 – 2012-07-23 14:27:05