【问题标题】:Is there a way to move data from a vector to a dynamic array?有没有办法将数据从向量移动到动态数组?
【发布时间】:2014-04-29 21:19:44
【问题描述】:

我使用std::vector 在函数中为我进行分配。完成后,我想从中获取纯数据而无需额外复制。数据 ptr 将由另一个类处理,所以我可以放弃向量,我不必关心它是否有效。基本上,我想转移向量数据的所有权。有没有办法做到这一点?

【问题讨论】:

  • 可能包含非常大量的序列化图数据
  • 如果你问是否有办法“分离”一个向量的内部缓冲区指针并将其发送给你自己的邪恶行为,没有。此外,它是用向量的分配器分配的,所以除非你用相同的方法销毁它,否则即使它可能的,你也是如履薄冰。
  • @WhozCraig,你是对的,我在发布答案后意识到我的逻辑不正确。无论如何,我已经删除了我的帖子。
  • 谢谢,那我得重写这篇了。
  • @Klaus,你是对的,我想我会将我的类包裹在 std::vector 周围并将向量移动到其中,然后按照我的意愿解释数据。

标签: c++ c++11 stl


【解决方案1】:

std::vector 的设计无法转让所有权。但是,您可以通过将其设为 static 并仅使用指向第一个元素的指针来延长向量的生命周期:

#include <iostream>
#include <vector>

int* getData()
{
    static std::vector<int> v;
    v.push_back(0);
    v.push_back(1);
    v.push_back(2);
    v.push_back(3);
    return v.data(); // pointer to first element, equivalent to &v.front() or &v[0]
}

int main()
{
    auto data = getData();
    for ( std::size_t i(0); i < 4; ++i )
    {
        std::cout << data[i] << "\n";
    }
}

演示:http://ideone.com/hsrOeH

由于向量是static,析构函数不会在作用域的末尾(即方法getData() 的末尾)调用。因此,在此范围之外使用.data() 返回的指针是安全的。

【讨论】:

  • 在调用push_back 之前,您可能需要clear 向量。否则,每次调用getData 时,向量都会变大。
  • @FredOverflow 好吧,窃取指针的整个想法是愚蠢的。调用此方法(就像现在一样)将使先前的指针无效。但是clearpush_back 做同样的事情。这是不安全的。正确的方法是明显引用类中的向量
猜你喜欢
  • 2021-09-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-12-15
  • 2019-09-24
  • 1970-01-01
  • 1970-01-01
  • 2016-05-11
相关资源
最近更新 更多