我正在尝试为我的迭代器和const_iterator类实现一个反向迭代器适配器,但有点麻烦.如果有人能指导我完成这一点,那将非常感激!
我的想法是我应该能够从我的rbegin()和rend()函数调用中创建一个反向迭代器
reverse_iterator rbegin();
reverse_iterator rend();
const_reverse_iterator rbegin() const;
const_reverse_iterator rend() const;
Run Code Online (Sandbox Code Playgroud)
我在课堂上使用以下typedef:
typedef btree_iterator<T> iterator;
typedef const_btree_iterator<T> const_iterator;
typedef reverse_btree_iterator<iterator> reverse_iterator;
typedef reverse_btree_iterator<const_iterator> const_reverse_iterator;
Run Code Online (Sandbox Code Playgroud)
如您所见,我希望能够使用模板创建反向迭代器,为reverse_iterator类提供迭代器或const_iterator.
不幸的是,有点我坚持......
下面是我目前拥有的类定义,但有错误.
template <typename I> class reverse_btree_iterator {
typedef ptrdiff_t difference_type;
typedef bidirectional_iterator_tag iterator_category;
public:
reverse_btree_iterator() : base_(I()) {}
template <typename T> reverse_btree_iterator(const btree_iterator<T>& rhs) : base_(rhs) {}
I base() { return base_; }
I::reference operator*() const;
I::pointer operator->() const;
I& operator++();
I operator++(int);
I& operator--();
I operator--(int);
bool operator==(const I& other) const;
bool …
Run Code Online (Sandbox Code Playgroud) 我一直在考虑如何设计一个数据库,以便在一年多的时间内保持考试问题(开启和关闭,主要是关闭).
首先,简要介绍一下我所追求的内容.我想设计一个足够灵活的数据库来存储不同的问题类型(例如,简短回答或多项选择问题),并且能够选择任意数量的这些问题作为考试存储.
我的问题是:
如何存储考试题?
由于不同的问题类型需要存储不同的字段,如果我将它们全部放在同一个表中questions
,将会有许多从未使用过的额外字段.
如果我将问题类型分成不同的表,那么将question_id存储在某个exam_questions
表中将会困难得多,因为它们将来自不同的表.
我也想不出一种灵活的方式来存储信息.
例如,
questions
- id
- question
- type (multiple choice, short response)
- choice_1 ( used for multiple choice questions)
- choice_2
- choice_3
- choice_4
- choice_5
- answer (short response answer here, or just a/b/c/d/e for multiple choice, t/f for true or false)
Run Code Online (Sandbox Code Playgroud)
这样的设计会被推荐吗?如果没有,有没有人有任何建议?
我还有另一个问题:
如果我想将学生的答案存储到这些考试中,那么将它们存储起来效率是否低效?
exam_responses
- id
- student_id
- exam_id
- question_id or question_number
- response
- mark
Run Code Online (Sandbox Code Playgroud)
先感谢您.如果您想要任何其他信息,或者此问题有任何问题,请给我留言,我会尽快修复.
我的C++指针存在问题,如果有人能够与我分享他们的专业知识,那就太棒了!
我得到的输出是:
1:
2:
END: C
1:C
2:E
END: E
Run Code Online (Sandbox Code Playgroud)
我期待的输出是:
1:
2:
END: C
1:C
2:C
END: E
Run Code Online (Sandbox Code Playgroud)
相关代码是这样的:
我的test.cpp
tree.insert('C');
tree.insert('E');
Run Code Online (Sandbox Code Playgroud)
插入功能:
template <typename T> pair<typename btree<T>::iterator, bool> btree<T>::insert(const T& elem) {
cout << "1:" << this->rbegin_->value() << endl;
btree_node<T> node(elem);
cout << "2:" << this->rbegin_->value() << endl;
rbegin_ = &node;
iterator itr;
pair<typename btree<T>::iterator, bool> p(itr, false);
cout << "END: " << this->rbegin_->value() << endl;
return p;
}
Run Code Online (Sandbox Code Playgroud)
btree_node的构造函数(基本上是空的):
template <typename T> btree_node<T>::btree_node(const T& elem) : value_(elem), …
Run Code Online (Sandbox Code Playgroud) 我正在为一个b树创建自己的迭代器,而且我一直坚持如何在没有编译器抱怨的情况下实现后增量运算符.
错误消息如下所示,并且是预期的(因为我正在做错误消息所说的)
cc1plus: warnings being treated as errors
error: reference to local variable 'temp' returned
Run Code Online (Sandbox Code Playgroud)
我需要使用-Wall和-Werror标记编写函数,所以希望有人能够帮助我解决这个问题.
这是功能:
template <typename T> btree_iterator<T>& btree_iterator<T>::operator++(int) {
btree_iterator<T> temp(*this);
pointee_ = pointee_->nextNode();
return temp;
}
Run Code Online (Sandbox Code Playgroud)
我环顾四周,我只能找到人们实现操作员的例子.
每当我以前遇到这样的问题时,我'新'了我正在返回的对象,以便它不再是临时的.但由于这是一个迭代器,如果我这样做,我将无法释放内存,从而导致内存泄漏.
如果有人能够帮助我,那将非常感谢!如果我的设计还有其他任何可以帮助您理解问题的信息,请告诉我.
问候.