c++ - 如何在 C++ 中循环访问自定义列表

标签 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 循环,我已经习惯了它是一个增强的 for 循环,就像在 Java 中一样,在 C++ 中也是一样吗?如果是这样,我如何使这个对象可迭代?

我想如果我直接提问,我的问题会得到更准确的答案。

最佳答案

验证 Range-based for 的指南可以在 http://en.cppreference.com/w/cpp/language/range-for 上找到

If range_expression is an expression of a class type C that has a member named begin and/or a member named end (regardless of the type or accessibility of such member), then begin_expr is __range.begin() and end_expr is __range.end();

简而言之,由于您的数据在原始数组中,您应该将这些public 方法添加到类List<T> 中。

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

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

for (char c : list)

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

这个答案解决了关于如何启用 Range-based for 的“主要”问题。为你的类(class)。它只需要两个方法 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 的嵌套类..

关于c++ - 如何在 C++ 中循环访问自定义列表,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/45003726/

相关文章:

c++ - 如果函数在匿名命名空间中声明,是否可以在全局命名空间中定义?

java - 在没有数组变量的情况下迭代java中的静态数组

java - 如何遍历 Java 中函数返回的数组

c++ - 地理坐标插值c++

c++ - 如何在Linux ubuntu下链接 Armadillo 给出链接错误

c# - 为什么在通过 IEnumerable<T> 更改 foreach 类型时没有出现编译器错误?

从 R 中的 foreach 循环返回列表的列表

python - 将递归计算器重构为迭代计算器

c++ - 如何遍历存储在 map 中的对象 vector ? C++

c++ - glRotatef 移动轴