如果你想把一个可迭代范围和另一个在某种程度上转换底层迭代器,并允许循环或构造其他对象:
for (auto ch : Upper("abcdef"))
{
// Prints "ABCDEF"
std::cout <
<
ch;
}
Upper up(std::string("fOo"));
std::string newfoo(std::begin(up), std::end(up));
assert(newfoo == "FOO");
然后,类似于一个普通的迭代范围,你将需要创建一个范围类和一个迭代器类:
class myit
{
private:
std::string::const_iterator wrapped_;
class charholder
{
const char value_;
public:
charholder(const char value) : value_(value) {}
char operator*() const { return value_;
}
};
public:
// Previously provided by std::iterator
typedef intvalue_type;
typedef std::ptrdiff_tdifference_type;
typedef int*pointer;
typedef int&
reference;
typedef std::input_iterator_tag iterator_category;
explicit myit(std::string::const_iterator wrapped) : wrapped_(wrapped) {}
value_type operator*() const { return std::toupper(*wrapped_);
}
bool operator==(const myit&
other) const { return wrapped_ == other.wrapped_;
}
bool operator!=(const myit&
other) const { return !(*this == other);
}
charholder operator++(int)
{
charholder ret(std::toupper(*wrapped_));
++wrapped_;
return ret;
}
myit&
operator++()
{
++wrapped_;
return *this;
}
};
class Upper
{
private:
const std::string str_;
public:
Upper(const std::string str) : str_(str) {}
myit begin() { return myit(std::begin(str_));
}
myit end(){ return myit(std::end(str_));
}
};
【C++迭代器或包装器适配器示例】请注意需要调用转换/适应函数std::toupper在两个地方。更新:std::iterator在c++ 17中是不推荐的,因此被删除。
推荐阅读
- 在模拟器中运行可重复测试的Android项目示例
- 在Ubuntu 18.04上安装Flarum详细步骤
- 使用Kotlin DSL在Gradle中构建一个全能的Jar
- 使用Netty 4的简单例子详细步骤
- Essential for development: these websites/tools make you more different!
- Renix修改报文长度——网络测试仪实操
- #聊一聊悟空编辑器#spring框架事务相关知识点Spring框架教程
- #yyds干货盘点#Python爬虫实战,pyecharts模块,Python实现中国地铁数据可视化
- 我以订披萨为例,给女朋友详细讲了Java设计模式的3种工厂模式