gpt4 book ai didi

c++ - 如何实现一个公开多个范围的容器?

转载 作者:塔克拉玛干 更新时间:2023-11-02 23:45:55 24 4
gpt4 key购买 nike

我有一个容器(除其他外)公开了一个字符串缓冲区,以及该字符串缓冲区的大写版本。 (好吧,它不仅仅是大写,但在概念上是相似的)我想允许调用者做类似的事情:

container c("Example");
auto const iter = c.begin() + 2;
std::printf("%c\n", iter->get_source()); // Prints a
std::printf("%c\n", iter->get_upper()); // Prints A
iter->set('x');

std::puts(c.get()); // Prints Exxmple
std::puts(c.get_upper()); // Prints EXXMPLE

问题是,具有成员函数的“代理”类型 get_source , get_upper等没有明显的地方可以存储,并且需要迭代器来返回对某物的引用,而不是值。 (vector<bool>也有类似问题)

或者,我可以公开某种 shell 容器或范围,或者公开完全独立的迭代器开始/结束函数。有没有人有过这样做的经验并且知道什么效果好?

最佳答案

我个人处理这类事情的方法是使用属性映射:我envision a system可以[可选]为每个范围获取属性映射(或者实际上有时是多个属性映射)的算法。这个想法是 *it 产生一个 key(例如,它当前做的 T&)然后与一个属性映射一起使用,该属性映射转换键入实际访问的。例如,转换可以是产生算法当前行为的标识,以及在没有属性映射时使用的良好默认值。上面的例子看起来像这样:

auto const cursor = c.begin();
std::printf("%c\n", c.map_source()(*cursor));
std::printf("%c\n", c.map_upper()(*cursor));
c.map_source()(*cursor, 'x');

std::copy(c.map_source(), c, std::ostreambuf_iterator<char>(std::cout));
std::copy(c.map_upper(), c, std::ostreambuf_iterator<char>(std::cout));
std::copy([](unsigned char c)->char{ return std::toupper(c); }, c,
std::ostreambuf_iterator<char>(std::cout));

代码假定生成源和大写字符的属性映射分别使用 c.map_source()c.map_upper() 获得。使用 std::copy() 的最后一个变体使用 lambda 函数作为属性映射。

可悲的是,我仍然没有时间写出一个连贯的提案来应用对 STL 算法的各种改进。 ...我也没有将它们放在一起的实现(我有一个 somewhat clunky implementation 大约有 10 年的历史,并且没有受益于各种 C++11 特性,这些特性使它变得容易得多;此外,这个实现只专注于属性映射,并没有使用我目前设想的界面)。

关于c++ - 如何实现一个公开多个范围的容器?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20725570/

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