gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 05:11:30 24 4
gpt4 key购买 nike

我只是想降低 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com