【发布时间】:2011-08-28 19:27:42
【问题描述】:
所以,我有一个类基于附加到字符串中每个字符的元数据进行字符串操作。在内部,我用std::vector<CharacterType> 表示它,其中CharacterType 包含有问题的字符等。这种内部表示对我很有用,但在操作结束时,类用户对字符串本身感兴趣。
为了做到这一点,我决定扩展std::vector<CharacterType>::iterator 以包含一个返回字符而不是CharacterType 的operator*() 方法。这是代码,它适用于 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++ 类型感知方法重载在 myit 中拥有多个 operator*() 方法,以便我可以使用相同的迭代器类来获取不同类型的另一个成员?还是使用模板会更好?例如,一个元数据是角色的语言,我希望能够以完全相同的方式提取std::vector<LanguageType>。想法?
此外,由于返回这些数据的方法不会影响对象的内部表示,为了 const 的正确性,我希望能够定义访问器 const。这可能意味着我需要修改上面的内容以使用const_iterator,但我还没有做到这一点。
提前感谢您的风格评论!
【问题讨论】:
标签: c++ string vector iterator