如果向量为空, std::vector::data() 应该返回什么?

What should std::vector::data() return if the vector is empty?(如果向量为空, std::vector::data() 应该返回什么?)
本文介绍了如果向量为空, std::vector::data() 应该返回什么?的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着跟版网的小编来一起学习吧!

问题描述

限时送ChatGPT账号..

根据标准草案(23.3.6.4 向量数据)、data()指向底层数组且[data(), data() + size())必须是有效范围:

According to the draft standard (23.3.6.4 vector data), data() points to the underlying array and [data(), data() + size()) must be a valid range:

T* data() noexcept;
const T* data() const noexcept;

    1 Returns: A pointer such that [data(),data() + size()) is a valid range. For a non-empty vector,
data() == &front().
    2 Complexity: Constant time

但是如果向量是空的呢?当我构造一个零大小的向量时:

But what if the vector is empty? When I construct a zero-size vector:

#include <vector>
#include <iostream>

int main() {
    const int NUM = 0*10;
    std::vector< double > v( NUM, 0.0 );
    std::cerr << "V : "<< v.data() << std::endl;
}

MSVC 2010 返回 null,但在 Linux(使用 GCC 4.2.1 和 Intel 12.1)上我得到一个非 null 地址.

MSVC 2010 returns null, but on Linux (with GCC 4.2.1 and Intel 12.1) I get a non-null address.

是否允许 vector::data() 或者它应该返回 null?例如,实现是否可以进行默认大小的初始分配并返回指向它的(非空)指针?

Is vector::data() allowed to or should it return null? Could an implementation, for example, do a default-size initial allocation and return a (non-null) pointer to it?

几个答案侧重于空范围的有效性.我完全同意.

Several answers focus on the validity of an empty-range. I fully agree there.

我真的很想看到一个很好的参考或解释:是否允许必须返回空值或可能也返回非空?

I would really like to see a good reference or explanation for: Is it allowed to, must it return null or may it also return non-null?

推荐答案

范围的约定是[inclusive,exclusive),也就是说如果你遍历一个范围 [X,Y) 您将从概念上执行以下操作(伪代码):

The convention for ranges is [inclusive, exclusive), that is if you iterate over a range [X,Y) you will conceptually do the following (pseudo-code):

for( iterator ii = X; ii != Y; ++ii) {
...
}

这允许将空范围表示为 [X,X).此外,这个空范围为每个地址定义得很好,无论它是有效还是无效.

This permits to express an empty range as [X,X). Also this empty range is perfectly well defined for each address, no matter if it is valid or invalid.

也就是说 data() 的要求是(强调我的):

That said the requirements for data() are (emphasis mine):

23.3.6.4 [vector.data]

T* data() noexcept;

T* data() noexcept;

const T* data() const noexcept;

const T* data() const noexcept;

返回:一个指针,使得[data(),data() + size()) 是一个有效范围.为一个非空向量,data() == &front().

Returns: A pointer such that [data(),data() + size()) is a valid range. For a non-empty vector, data() == &front().

在我看来,唯一的无条件保证是 [data(),data() + size()) 应该是一个有效范围.对于 size() == 0 成员函数 data() 可以返回任何值,范围将是一个有效的空范围.因此,我会说如果size()为零,则允许实现返回非空指针.

It seems to me that the only unconditional guarantee is that [data(),data() + size()) should be a valid range. For size() == 0 the member function data() may return any value and the range will be a valid empty range. Therefore I would say that an implementation is allowed to return a non-null pointer if size() is zero.

这篇关于如果向量为空, std::vector::data() 应该返回什么?的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持跟版网!

本站部分内容来源互联网,如果有图片或者内容侵犯了您的权益,请联系我们,我们会在确认后第一时间进行删除!

相关文档推荐

OpenGL transforming objects with multiple rotations of Different axis(OpenGL 变换不同轴多次旋转的对象)
GLFW first responder error(GLFW 第一响应者错误)
SOIL not linking correctly(SOIL 连接不正确)
Core profile vs version string? Only getting GLSL 1.3/OGL 3.0 in mesa 10.0.1(核心配置文件与版本字符串?在 mesa 10.0.1 中只获得 GLSL 1.3/OGL 3.0)
What is the range of OpenGL texture ID?(OpenGL 纹理 ID 的范围是多少?)
How taxing are OpenGL glDrawElements() calls compared to basic logic code?(与基本逻辑代码相比,OpenGL glDrawElements() 调用的繁重程度如何?)