相关疑难解决方法(0)

如何正确实现自定义迭代器和const_iterators?

我有一个自定义容器类,我想写它iteratorconst_iterator类.

我之前从未这样做过,但我找不到合适的方法.关于迭代器创建的指导原则是什么,我应该注意什么?

我也想避免代码重复(我觉得const_iteratoriterator分享很多东西;应该是另一个子类吗?).

脚注:我很确定Boost有什么可以缓解的,但我不能在这里使用它,因为很多愚蠢的原因.

c++ iterator const-iterator

217
推荐指数
8
解决办法
17万
查看次数

编写自己的STL容器

是否应该编写一个与任何STL容器一样的新容器?

c++ stl c++-standard-library

114
推荐指数
3
解决办法
5万
查看次数

c ++ 11 foreach语法和自定义迭代器

我正在编写一个用于代替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为类使用正确的迭代器需要什么?

c++ iterator c++11

59
推荐指数
3
解决办法
5万
查看次数

什么是C++中的代理类

什么是C++中的代理类?为什么创建它以及它在哪里有用?

c++ proxy design-patterns

42
推荐指数
3
解决办法
5万
查看次数

C++中的自定义迭代器

我有一个类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成员变量向量中包含的所有项的好迭代器是什么.

c++ iterator stl

29
推荐指数
4
解决办法
4万
查看次数

为什么我的自定义迭代器不能与STL副本一起使用?

我写了一个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)

c++ iterator stl

10
推荐指数
3
解决办法
8525
查看次数

为双向链表实现begin()和end()

我编写了自己的容器类,其原始内部数据结构是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()标准库做同样的方式?

c++ iterator linked-list list stdlist

3
推荐指数
1
解决办法
9532
查看次数

C++ 列表与快速查找

我正在与一个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 。

c++ containers list std c++17

3
推荐指数
1
解决办法
1917
查看次数

在 C++11 中实现自定义迭代器

我正在读一本书,我开始了模板章节。我已经阅读了关于迭代器的章节。为了练习,我正在尝试使用模板实现一个双向链接的类。下面是我的类的头文件。

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,但我这样做只是为了练习。)

c++ c++11

1
推荐指数
1
解决办法
6560
查看次数

如何调用postfix operator ++?

假设我有以下代码:

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是一个整数吗?

c++ c++11

1
推荐指数
1
解决办法
250
查看次数

我在实现++ increment运算符时遇到问题

我正在尝试为刚刚完成的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)

c++ operator-overloading

0
推荐指数
1
解决办法
3091
查看次数