【发布时间】:2017-08-25 02:35:40
【问题描述】:
在与迭代器和容器相处时,我偶然发现了一个我正在尝试实施的小实验。但是,我很早就被卡住了。
这个想法是创建一个链表,其中包含两种不同类型的条目,即 out 和 in 项。所有项目都链接在一起,而同类项目也包含相互引用。
接下来,我希望能够通过迭代器以三种不同的方式循环数据结构:
- 任何,其中遍历整个数据结构。
- In,其中仅遍历 in 项。
- Out,仅遍历 out 项。
所以当调用上面列出的任何类型时,只有一个 begin() 和 end() 迭代器被传递给请求者。
我已经为以下数据结构设置了一个,我可以按照上面提到的方式循环它,虽然我不能设置迭代器。
template <class T>
struct dual_node {
/*
* Constructors
*/
dual_node(T data): data(data) {};
/*
* Operators
*/
bool operator ==(const dual_node<T> &rhs) const {
return this->data == rhs.data;
}
/*
* Members
*/
T data;
dual_node *type_next = nullptr;
dual_node *type_prev = nullptr;
};
包装类:
using namespace std;
template <class T>
class DualLinkedList {
public:
/*
* Mutators
*/
template <class Direction>
void push_front(T element){
elements.push_front(dual_node<T>(element));
Direction::template set_ptr<T>(elements.front(), &last_in, &last_out);
}
void remove(T element){
auto it = find(elements.begin(), elements.end(), element);
// Element found
if(it != elements.end()){
// If it has a previous
if(it->type_prev) {
it->type_prev->type_next = it->type_next;
}else{
// No previous, so last_in or last_out should match.
if(*last_in == *it){
last_in = it->type_next;
}
if(*last_out == *it){
last_out = it->type_next;
}
}
// Remove from forward_list
elements.remove(*it);
}
}
//private:
forward_list<dual_node<T>> elements;
dual_node<T> *last_in;
dual_node<T> *last_out;
};
方向类:
struct in {
static edge_list& get_list(pair<edge_list, edge_list> &a) {
return a.first;
}
// conceptual
static pair<iterator, iterator> get_it_pair(dual_node<T>** last_in){
// Return iterator starting at last_in, following type_next pointers
}
template <class T>
static void set_ptr(dual_node<T> &element, dual_node<T>** last_in, dual_node<T>** last_out){
// If last incoming exists.
if(*last_in) {
(**last_in).type_prev = &element;
}
element.type_next = *last_in;
*last_in = &element;
}
};
struct out {
static edge_list& get_list(pair<edge_list, edge_list> &a) {
return a.second;
}
// conceptual
static pair<iterator, iterator> get_it_pair(dual_node<T>** last_out){
// Return iterator starting at last_out, following type_next ptrs
}
template <class T>
static void set_ptr(dual_node<T> &element, dual_node<T>** last_in, dual_node<T>** last_out) {
// If last outgoing exists.
if(*last_out) {
(**last_out).type_prev = &element;
}
element.type_next = *last_out;
*last_out = &element;
}
};
struct any {
// conceptual
static pair<iterator, iterator> get_it_pair(dual_node<T>** last_out){
// Returning iterator starting at last out following forward_list
}
};
【问题讨论】:
标签: c++ data-structures iterator containers