【问题标题】:How to get std::vector pointer to the raw data?如何获取指向原始数据的 std::vector 指针?
【发布时间】:2011-09-23 01:13:57
【问题描述】:

我正在尝试将std::vector 用作char 数组。

我的函数接受一个空指针:

void process_data(const void *data);

在我只是简单地使用这段代码之前:

char something[] = "my data here";
process_data(something);

按预期工作。

但现在我需要std::vector的动态性,所以我尝试了这段代码:

vector<char> something;
*cut*
process_data(something);

问题是,我如何将 char 向量传递给我的函数,以便我可以访问向量原始数据(无论它是哪种格式——浮点数等)?

我试过了:

process_data(&something);

还有这个:

process_data(&something.begin());

但它返回了一个指向乱码数据的指针,后者给出了警告:warning C4238: nonstandard extension used : class rvalue used as lvalue

【问题讨论】:

    标签: c++ stl vector


    【解决方案1】:

    &amp;something 为您提供std::vector 对象的地址,而不是它保存的数据的地址。 &amp;something.begin() 为您提供begin() 返回的迭代器的地址(正如编译器警告的那样,这在技术上是不允许的,因为something.begin() 是一个右值表达式,因此不能获取其地址)。

    假设容器中至少有一个元素,则需要获取容器初始元素的地址,可以通过

    • &amp;something[0]&amp;something.front()(索引 0 处元素的地址),或

    • &amp;*something.begin()begin()返回的迭代器指向的元素的地址)。

    在 C++11 中,std::vector 添加了一个新的成员函数:data()。这个成员函数返回容器中初始元素的地址,就像&amp;something.front()一样。这个成员函数的好处是即使容器是空的也可以调用它。

    【讨论】:

    • 重要注意vector&lt;bool&gt;,这是这个答案的例外(并且没有bools的连续内存存储)。
    • 从好的方面来说,没有什么需要注意的:所有这三个方法都将无法使用 std::vector&lt;bool&gt; 进行编译,因为 std::vector&lt;bool&gt; 需要使用代理对象而该代理不能隐式转换为bool*。作为解决方法,如果您确实需要bool 的序列,最好只使用std::vector&lt;char&gt;。 @Motti
    • 没错,当心是一般性的,并没有直接作为你的答案,因为没有连续的内存存储,所以没有办法得到它。
    • 为了全面,但主要是为了.data() - 我会假装我没有看到那丑陋的&amp;*iterator:P
    • data() 返回的指针能存活多久?如果向量永远不会被调整得更大或更小(通过push_back() 或其他函数,包括reserve),是否可以保证指针在向量存在时会一直存在,并指向正确的位置?
    【解决方案2】:

    something.data() 将返回一个指向向量数据空间的指针。

    【讨论】:

    • error C2039: 'data' : is not a member of 'std::vector&lt;_Ty&gt;'
    • @Rookie:看起来您使用的是损坏的编译器——C++ 规范中的 23.3.6.3 定义了 vector::data。尝试向您的供应商提交错误或获得更好的编译器。
    • @Chris Dodd 我有同样的错误。我正在使用 Visual Studio 2008。
    • @ChrisDodd: vector::data() 是 C++11 的新手
    • 我使用 Visual Studio 2012,他们肯定添加了 vector::data(),因为我经常使用它。
    【解决方案3】:

    取一个指向第一个元素的指针:

    process_data (&something [0]);
    

    【讨论】:

    • 我以为即使没有下标括号它也会返回第一项的内存地址?
    • 那是数组,不是向量。
    • 是的,刚刚意识到,对不起。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-04-02
    • 2016-02-19
    • 2020-05-19
    • 1970-01-01
    相关资源
    最近更新 更多