gpt4 book ai didi

c++ - 扩展 vector 迭代器以访问包含的类/结构的数据成员

转载 作者:塔克拉玛干 更新时间:2023-11-03 08:01:22 26 4
gpt4 key购买 nike

因此,我有一个类可以根据附加到字符串中每个字符的元数据进行字符串操作。在内部,我用 std::vector<CharacterType> 表示它其中 CharacterType包含,除其他外,有问题的字符。这种内部表示对我很有用,但在操作结束时,类用户对字符串本身感兴趣。

为了做到这一点,我决定延长std::vector<CharacterType>::iterator包括 operator*()返回字符而不是 CharacterType 的方法.这是代码,它可以在 Windows 7 上的 Visual Studio 2008 中运行。但它是惯用的 C++ 吗?我自 90 年代以来就没有写过太多 C++,所以如果有人对这种风格或我正在做一些危险和/或邪恶的事情提出反馈,我将不胜感激。 (在下面的代码中,我创建了一个名为 CharacterType 的简化 mytype 结构——实际上该结构要大得多。)

#include <iostream>
#include <vector>
#include <string>

struct mytype {
char c;
};

class myit : public std::vector<mytype>::iterator {
public:
inline myit(std::vector<mytype>::iterator const &c)
: std::vector<mytype>::iterator(c) {}
char operator*() {
const mytype &p =
std::vector<mytype>::iterator::operator*();
return p.c;
}

// Added these in a later edit, after thinking about a comment below
typedef char value_type;
typedef char *pointer;
typedef char &reference;

private:
};

int
main()
{
mytype test[] = { {'a'}, {'b'}, {'c'}, {'d'} };
std::vector<mytype> vec(&test[0], &test[4]);
myit i(vec.begin()), e(vec.end());
std::string str(i, e);

std::cout << str << std::endl;
return 0;
}

假设这是好的风格,使用 C++ 类型感知方法重载来拥有多个 operator*() 是否合适? myit 中的方法以便我可以使用相同的迭代器类来获取不同类型的另一个成员?或者使用模板会更好吗?例如,一个元数据是角色的语言,我希望能够提取一个 std::vector<LanguageType>以完全相同的方式。想法?

此外,由于返回这些数据的方法不影响对象的内部表示,为了 const 的正确性,我希望能够定义访问器 const .这可能意味着我需要修改上面的内容以使用 const_iterator相反,但我还没有做到这一点。

提前感谢您的风格评论!

最佳答案

您不应该派生 std::vector(也不是其他 STL 容器),因为它的析构函数不是虚拟的,您可能会遇到未调用 vector 的析构函数的情况,从而导致内存泄漏。

关于c++ - 扩展 vector 迭代器以访问包含的类/结构的数据成员,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/6057893/

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