对原生c++指针(如uint16 *)的std::find()的替代或增强

Alternatives or enhancements to std::find() on a native c++ pointer (such as uint16 *)

本文关键字:find 增强 原生 std uint16 c++ 指针      更新时间:2023-10-16

我正在尝试用一行c++条件检查来检查缓冲区内值的存在。(就像python中list: check中的if 'value')

std::find似乎很适合这里。

char *buf = "01020304";
int buf_len = 8
uint16_t *ptr = std::find((uint16_t *) buf, (uint16_t *) buf + 3, (uint16_t)13360);    // 13360 corresponds to 2 bytes in "04"
std::cout <<"n(ptr-buf):"<<(ptr-(uint16_t *) buf);//returns 3  for any value, even if 0 is passed instead of 13360 since the last 2 bytes are not searched (buf+6, buf +7))

std::find似乎在缓冲区的[first, last]范围内搜索。这对于像vector这样的STL类型是有意义的。但是,对于原始指针,使std::find()查看buf的最后一个元素的唯一方法涉及传递超出但是的偏移量(例如。buf + 8)。

这样做安全吗?我猜不会。是否有更好的替代使用std::find做单行存在检查的char *buffer ?

在STL算法中使用指针时,使用'过一结束'指针作为范围的结束迭代器是有效且正确的。在数组结束后1点对指针解引用是无效的,但可以对其进行测试,并对其进行某些算术运算。

标准规定了在"过了结束符1"指针上执行比较是有效的,第5.9.3节,"关系操作符":

5.9.3比较指针和对象的定义如下:

(3.1)—如果两个指针指向同一数组的不同元素,或指向其子对象,则指向下标较高的元素的指针相对较大。

(3.2)—如果一个指针指向数组的元素或其子对象,而另一个指针指向数组最后一个元素的后一位置,则后一个指针比较大。

它还指定了指针的加法和减法,使指针在std::distance(), std::advance()等算法中正确运行。

此外,标准对STL迭代器有如下规定:

就像指向数组的普通指针保证有一个指针值指向数组的最后一个元素一样,对于任何迭代器类型,都有一个迭代器值指向相应序列的最后一个元素。这些值称为结束后值。定义表达式*i的迭代器i的值称为可解引用的。标准库从不假定过端值是可解引用的. ...

结束指针之后也是标准的C。例如,使用算术运算可以安全地生成它们:来自C11标准,6.5.6(加法运算符)第8段:

…如果两个指针操作数和结果指向相同数组对象的元素,或者指向上一个数组对象元素,则计算不应产生溢出;否则,行为是未定义的。如果结果指向数组对象的最后一个元素之后的位置,则返回不能用作一元*运算符的操作数。