如何在C ++中循环自定义列表

时间:2017-07-10 04:22:21

标签: c++ foreach iteration

我只是试图让C ++失效并且做到这一点,我必须创建自己的库和诸如此类的东西。所以我试图获得自己的List模板类的开头,就像JDK中的List类一样。所以我得到了模板和东西,我只想知道如何制作它以便我可以循环遍历列表对象的内容。这样我就可以打印出所述对象的内容。我不知道从哪里开始。

#pragma once

template<typename T> class List {
public:
    List() : _size(0), _elements(nullptr) {}
    ~List() {
        if (_elements != nullptr) {
            delete[] _elements;
        }
    }

    inline int size() { return _size; }

    inline void add(T element) {
        _size++;

        T* buffer = new T[_size];

        if (_elements != nullptr) {
            memcpy(buffer, _elements, sizeof(T) * (_size - 1));
            delete[] _elements;
        }

        buffer[_size - 1] = element;
        _elements = buffer;
    }

    inline void remove(T element) {
        _size--;

        T* buffer = new T[_size];

        if (_elements != nullptr) {
            memcpy(buffer, _elements, sizeof(T) * _size);
            delete[] _elements;
        }
        else {
            assert(false);
        }

        _elements = buffer;
    }

    inline T* getElements() {
        return _elements;
    }
private:
    int _size;
    T* _elements;
};

这是我的主要Cpp文件

#include <cstdio>
#include <string>

#include "List.h"

using namespace std;

int main( int argc, char ** argv )
{
    string str = "This is a test!";
    List<char> list = breakString(str);
    for (char c : list.getElements()) {

    }
    getchar();
    return 0;
}

List<char> breakString(string str) {
    List<char> list;
    for (char c : str) {
        list.add(c);
    }
    return list;
}

所以我试图弄清楚的是for循环,我曾经习惯于像Java一样增强for循环,这在C ++中是一样的吗?如果是这样,我将如何使这个对象可迭代?

如果我直接询问,我想我会得到一个更准确的答案。

1 个答案:

答案 0 :(得分:1)

可以在http://en.cppreference.com/w/cpp/language/range-for

上找到验证Range-based for的指南
  

如果range_expression是类型C的表达式,其具有名为begin的成员和/或名为end的成员(无论此成员的类型或可访问性如何),则begin_expr为__range.begin(),end_expr为__range .END();

简而言之,由于您的数据位于原始数组中,因此您应将这些公共方法添加到类List<T>

T* begin() { return _elements;}
T* end() { return _elements + _size;}

然后您可以直接在对象上调用基于范围的for

for (char c : list)

但您的代码中还有其他问题。其中一个(不确定它是唯一的一个)是breakString返回一个对象,但是你的类并不简单,它没有定义任何copymove构造函数。

这个答案解决了关于如何为你的班级启用Range-based for的“主要”问题。它只需要两个方法begin()end()返回看起来像迭代器的东西(可能是实际的迭代器或指向连续内存块的指针“)

您可以在不使用breakString的情况下测试建议的修改,如下所示:

int main( int argc, char ** argv )
{
    std::string str = "This is a test!";
    List<char> list;
    for (char c : "abcdef") { list.add(c); }

    for (char c : list) { std::cout << c << "\n"; }
}

为了使其“完全可迭代”定义,您可以定义一个名为ierator的嵌套类..