一些算法(如字典搜索和比较)可以写得更短,无需对数组进行边界检查,特别是当涉及到通过索引比较字符串时。
例如:
int match=0;
for ( ; index–offset >= 0 && *(&index+line)–offset >= 0
&& text[index-match] == text[*(&index+line)-match]; ++match)
;
可以缩短为
int match=0;
for ( ;text[index-match] == text[*(&index+line)-match]; ++match)
;
问题在于,很多地方都有很多这样的边界检查,这使得代码更难阅读。
当然,我可以将这些值添加到数组中,但我只想确保比较会停止;否则我不想在其他地方看到这些停止值。所以,我想让它们“透明”。
万一有机会在 begin()
之前和
end()
处放置一个 stop-value(不属于向量中数据的值)可以解决问题。当然,我知道这是不可能的,原因有很多:
那么,实现这一目标最直接的方法是什么?我确信这是编程中的常见技巧,因此应该有一些东西可以简化其语言实现。
当然,这可以很容易解决,涉及另一级间接(另一个索引),但这太昂贵了。
我也会使用带有范围的投影/视图,但我需要具有尚未针对范围实现的执行策略。
是否有一些继承、包装、替换的方法仍然保留在类似数组的容器中(最好是
std::vector
)?
如果您想要哨兵,没有什么可以阻止您编写一个用两个额外元素包装
std::vector
的容器(并通过将底层容器偏移适当的量来实现诸如 begin()
/end()
系列等功能) 。您必须转发 emplace_back()
和 erase()
等等,但仍然比从头开始实现容器要少得多。
C++ 不提供这样的容器,因为没有足够多的人需要它(并且它不能作为
std::vector
的一部分实现,而不会给那些不使用它的人带来成本)。部分原因是,并不总是存在无法呈现的价值。