引用保留向量

时间:2017-07-17 04:25:45

标签: c++ vector

当向量中没有元素时,返回指向向量的底层缓冲区的正确方法是什么(size() == 0)。我先调用vector.reserve(),因此分配了内存。

我已尝试过以下操作,但它为我预期的相同值提供了不同的指针值。从我用Google搜索的内容来看,当.front()为零时,似乎未定义调用.data()size()。我需要获得一个指向矢量的指针,以便我可以将它传递给C函数。

int main() {
    std::unique_ptr<std::vector<int>> vec(new std::vector<int>(10));

    std::cout << std::hex 
              << (uint64_t)&vec.get()[0] << " "
              << (uint64_t)&vec->front() << " "
              << (uint64_t)vec->data() << std::endl;
    return 0;
}

输出:

  

2b324a4cec20 2b324a4cec40 2b324a4cec40

如果您在GCC上运行此代码,.data()将返回0.标准然后表示front()未定义,因为size()为0.您可以看到指针值不同。发生了什么事?

ideone example to play with

1 个答案:

答案 0 :(得分:0)

在阅读这些注释和更多googling之后,如果size()== 0

,似乎无法在不调用未定义行为的情况下检索向量的底层缓冲区(即使保留)
  •   

    &安培;无法调用operator [0],因为它是空矢量的UB

  •   

    &安培;无法调用at(0),因为它与operator []相同(并进行范围检查)

  •   

    .data()无法调用,因为它只保证   [data(),data()+ size)是有效范围,而不是范围   从0开始。

  •   无法调用

    &amp; front(),因为它是空矢量的UB

我个人认为这是语言中的错误。如果已调用reserve,Data()应返回指向vector的指针