有没有办法在 std::vector 数据的开始和结尾处引入透明的停止值?

问题描述 投票:0回答:1

一些算法(如字典搜索和比较)可以写得更短,无需对数组进行边界检查,特别是当涉及到通过索引比较字符串时。

例如:

    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
(不属于向量中数据的值)可以解决问题。当然,我知道这是不可能的,原因有很多:

  1. 使用此容器应该处理负索引作为运算符[]的输入
  2. 迭代器也将被迫在“数组之前”寻址内存,这是不可能的。
  3. 这打破了关于迭代器、容器、begin() 和 end() 的整个想法

那么,实现这一目标最直接的方法是什么?我确信这是编程中的常见技巧,因此应该有一些东西可以简化其语言实现。

当然,这可以很容易解决,涉及另一级间接(另一个索引),但这太昂贵了。

我也会使用带有范围的投影/视图,但我需要具有尚未针对范围实现的执行策略。

是否有一些继承、包装、替换的方法仍然保留在类似数组的容器中(最好是

std::vector
)?

c++ stl
1个回答
0
投票

如果您想要哨兵,没有什么可以阻止您编写一个用两个额外元素包装

std::vector
的容器(并通过将底层容器偏移适当的量来实现诸如
begin()
/
end()
系列等功能) 。您必须转发
emplace_back()
erase()
等等,但仍然比从头开始实现容器要少得多。

C++ 不提供这样的容器,因为没有足够多的人需要它(并且它不能作为

std::vector
的一部分实现,而不会给那些不使用它的人带来成本)。部分原因是,并不总是存在无法呈现的价值。

© www.soinside.com 2019 - 2024. All rights reserved.