我有一个自定义容器类,我想写它iterator和const_iterator类.
我之前从未这样做过,但我找不到合适的方法.关于迭代器创建的指导原则是什么,我应该注意什么?
我也想避免代码重复(我觉得const_iterator并iterator分享很多东西;应该是另一个子类吗?).
脚注:我很确定Boost有什么可以缓解的,但我不能在这里使用它,因为很多愚蠢的原因.
我正在编写一个用于代替STL容器的容器的迭代器.目前,STL容器正在许多地方使用c ++ 11 foreach语法,例如:for(auto &x: C).我们需要更新代码以使用包装STL容器的自定义类:
template< typename Type>
class SomeSortedContainer{
std::vector<typename Type> m_data; //we wish to iterate over this
//container implementation code
};
class SomeSortedContainerIterator{
//iterator code
};
Run Code Online (Sandbox Code Playgroud)
如何让自动为自定义容器使用正确的迭代器,以便能够以下列方式调用代码?:
SomeSortedContainer C;
for(auto &x : C){
//do something with x...
}
Run Code Online (Sandbox Code Playgroud)
一般来说,确保auto为类使用正确的迭代器需要什么?
我有一个类TContainer,它是指向TItems类的几个stl集合指针的集合.
我需要创建一个迭代器来遍历我的TContainer类中所有集合中的元素,从而抽象出内部工作的客户端.
这样做有什么好办法?我应该创建一个扩展迭代器的类(如果是这样,我应该扩展什么迭代器类),我应该创建一个迭代器类,它是迭代器的集合吗?
我只需要一个FORWARD_ONLY迭代器.
IE,如果这是我的容器:
typedef std::vector <TItem*> ItemVector;
class TContainer {
std::vector <ItemVector *> m_Items;
};
Run Code Online (Sandbox Code Playgroud)
遍历m_Items成员变量向量中包含的所有项的好迭代器是什么.
我写了一个OutputIterator来回答另一个问题.这里是:
#include <queue>
using namespace std;
template< typename T, typename U >
class queue_inserter {
queue<T, U> &qu;
public:
queue_inserter(queue<T,U> &q) : qu(q) { }
queue_inserter<T,U> operator ++ (int) { return *this; }
queue_inserter<T,U> operator * () { return *this; }
void operator = (const T &val) { qu.push(val); }
};
template< typename T, typename U >
queue_inserter<T,U> make_queue_inserter(queue<T,U> &q) {
return queue_inserter<T,U>(q);
}
Run Code Online (Sandbox Code Playgroud)
这适用于这个小复制功能:
template<typename II, typename OI>
void mycopy(II b, II e, OI oi) {
while …Run Code Online (Sandbox Code Playgroud) 我编写了自己的容器类,其原始内部数据结构是std::list.然后我需要创建自己的双向链表.我现在已经实现了我自己的双向链表以及链接列表的自己的迭代器,但是我遇到了问题std::list,特别是begin()和end().
根据我的理解,begin()应该指向第一个节点,并且end()应该将一个元素指向最后一个元素.我需要确保当我调用时end(),我可以减少回到有效的最后一个元素.我还需要确保我可以做正常的遍历,比如......
while (beg != end ) { do something; beg++; }
Run Code Online (Sandbox Code Playgroud)
本质上,我的链表只使用包含数据元素的节点,指向前一节点的指针和指向下一个节点的指针.
当我第一次尝试实现我的时候end(),我只有最后一个节点的下一个指针是a nullptr.它可以单独工作,但不会像stl一样工作.
关于如何实现的任何意见begin()和end()标准库做同样的方式?
我正在与一个std::list.
元素按“插入顺序”出现在列表中,而不是根据元素的值。
当std::find()-ing 一个元素时,必须搜索整个列表。
为了加快从 O(n) 到 O(log(n)) 的“查找”速度,我可以自己实现一个哈希映射来存储元素std::list位置,或者我可以使用 boost 多索引,https://www.boost .org/doc/libs/release/libs/multi_index/doc/tutorial/basics.html#list_fast_lookup。
问题:如今,使用 C++17,是否有一种标准/通用或最佳实践方法来实现具有列表所有属性以及快速find(例如 remove)的容器?或者说,这样的容器类型是否已经存在?也许是 C++20?
编辑/注意:列表中元素的顺序是相关的,因此不能直接使用 std::map 。
我正在读一本书,我开始了模板章节。我已经阅读了关于迭代器的章节。为了练习,我正在尝试使用模板实现一个双向链接的类。下面是我的类的头文件。
template<typename T>
class list
{
private:
T* first_node;
T* last_node;
struct node_structure
{
T* previous;
T* next;
T content;
};
public:
list();
void push_back( T& item );
void push_front( T& item );
void remove( size_t index );
size_t size() const;
T& get_node( size_t index );
void clear();
~list();
};
Run Code Online (Sandbox Code Playgroud)
我可以设置两个成员:
T* begin();
T* end();
Run Code Online (Sandbox Code Playgroud)
...表现得像非常基本的迭代器,但它们实际上不是迭代器。所以,我有一个问题:
如何实现自定义的迭代器类与所有的算术运算和使用有begin(),cbegin(),end(),和cend()?
(我知道创建列表类的效率不如std::list,但我这样做只是为了练习。)
假设我有以下代码:
struct ReverseIterator : public Iterator {
ReverseIterator& operator++() {Iterator::operator--();}
ReverseIterator& operator--() {Iterator::operator++();}
ReverseIterator operator++(int) { /* ... */ }
ReverseIterator operator--(int) { /* ... */ }
}
Run Code Online (Sandbox Code Playgroud)
如何调用基类,迭代器,后缀增量/减量运算符?我理解为了区分修复前和修复后,正在传递临时虚拟变量.如果是这样的话,我不能只调用Iteartor::operator++(1);正弦1是一个整数吗?
我正在尝试为刚刚完成的ac库提供c ++接口,我希望它可以编写
for (DBITable table = db.tables() ; table != NULL ; table++)
Run Code Online (Sandbox Code Playgroud)
where db是一个带有tables()返回DBITable与之关联的方法的类.
在编译时,我得到以下错误 clang++
error: cannot increment value of type 'DBITable'
for (DBITable table = db.tables() ; table != NULL ; table++)
~~~~~^
Run Code Online (Sandbox Code Playgroud)
这就是我实现++运算符重载方法的方法
DBITable
DBITable::operator++()
{
return next();
}
Run Code Online (Sandbox Code Playgroud)
它在DBITable课堂上被宣布为
public:
DBITable operator++();
Run Code Online (Sandbox Code Playgroud)
这table != NULL部分按照我的预期通过这样做
bool operator!=(void *)
{
// evaluate and get the value
return value;
}
Run Code Online (Sandbox Code Playgroud)