Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/125.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 标记数组结尾的正确方法_C++ - Fatal编程技术网

C++ 标记数组结尾的正确方法

C++ 标记数组结尾的正确方法,c++,C++,我只能访问数组,不能访问向量 假设我可能需要一个包含100个对象的数组,但可能更少。如果较少,是否有一种优雅的方式标记此点,以便知道不需要其他对象 或者我必须将其存储在对象本身中吗?没有空字符的等价物吗?没有,内存中没有标记数组结尾的内容。没有“空字符的等价物”。你有责任跟踪此事 使用std::vector的众多原因之一是,该向量跟踪这一点。但是,正如您所说的,您“可以访问数组而不是向量”,那么就由您来处理向量的责任。有几种可能的方法 您可以使用sentinel值,并将该值放在数组的末尾,就像'

我只能访问数组,不能访问向量

假设我可能需要一个包含100个对象的数组,但可能更少。如果较少,是否有一种优雅的方式标记此点,以便知道不需要其他对象


或者我必须将其存储在对象本身中吗?没有空字符的等价物吗?

没有,内存中没有标记数组结尾的内容。没有“空字符的等价物”。你有责任跟踪此事


使用
std::vector
的众多原因之一是,该向量跟踪这一点。但是,正如您所说的,您“可以访问数组而不是向量”,那么就由您来处理向量的责任。

有几种可能的方法

您可以使用sentinel值,并将该值放在数组的末尾,就像
'\0'
标记C样式字符串的结尾一样。问题是,您必须确保您需要存储的数据中永远不会出现sentinel值

您可以随身携带数组中值的数量,并将该值传递给处理数组的函数


可以创建指向数组中最后一个元素的指针,并将数组作为一对指针处理:一个指向第一个元素,另一个指向末尾。这与STL算法兼容,因此它可能是您最好的总体方法。

使用指针数组,并首先停止
nullptr
?@OP--您刚刚说明了数组出现问题的一个原因。如果你声明了一个包含100个对象的数组,那么你有100个对象,没有“可能更少”。什么类型的对象?当然,例如,您可以有一个
int
数组,然后在迭代时在第一个
0
值处停止。:)做一个指向“结束”的指针?在迭代数组时,检查内存地址是否与指针相同。是否允许将数组封装在类中,即使它不是
std::vector
或类似的数组?如果是,则可以跟踪其中最后一个填充位置,并提供自己的
end()
。标记数组结尾的null或零值是字符串的null字符的文字等效值。事实上,这是一种常见的模式(通过使用
std::vector
std::array
)通过使用
nullptr
标记未知长度指针数组的结尾。但是,正如您所说,在大多数情况下,最好使用
std::vector
或具有大小字段的等效数据结构。使用以null结尾的数组的一个主要缺点是检查大小是一个O(n)操作,并且由于不检查大小就无法安全地进行随机访问,因此使随机访问也成为一个O(n)活动