如何手动分配矢量的大小?

How to manually assign vector's size?

在我的应用程序中,有一部分需要我制作一个容器的副本。目前我使用 std::vector (但可能会考虑使用其他东西)。该应用程序对延迟非常敏感。所以,我一直在寻找一种方法来尽可能快地复制矢量。我发现 memcpy 比其他任何东西都做得更好。但是,它不会改变向量的内部大小。 IE。 vector.size() 仍然会给我 0。

我知道我走的路有多滑。我不介意放弃安全检查。我知道有多少元素被复制了。我不想使用 vector.resize() 来更改目标向量的大小(这是一个缓慢的操作)。

问题:

std::vector<my_struct> destination_vector;
destination_vector.reserve(container_length);
std::memcpy(destination_vector.data(), original_vector.data(), sizeof(my_struct)*container_length);

在上面的代码之后,我需要告诉我的 destination_vector 它是什么尺寸。我该怎么做?

谢谢。

  1. 在使用 memcpy():

    将内容复制到矢量之前,您 必须 实际上 resize() 矢量

    destination_vector.resize(container_length);

    但最好首先避免使用 memcpy() 并使用机制复制 vectorvector 提供的内容,如其他答案:

    std::vector<my_struct> destination_vector(original_vector);

    或者如果 destination_vector 实例已经存在:

    destination_vector.insert(destination_vector.begin(), original_vector.begin(), original_vector.end);

    或者,如果您不再需要原始内容,则最快:

    destination_vector.swap(original_vector);

    所有这些变体都将与您的 memcpy() 变体一样快,甚至更快。如果您遇到缓慢,请参阅 2.:

  2. 您可能在 my_struct 中有一个非平凡的默认构造函数。删除它,或插入一个简单的(空的)默认构造函数来加快速度(避免构造许多您从未使用过的元素)。

  3. 如果 my_struct 包含非 POD 数据成员(如 std::string),则根本不能使用 memcpy()

(旁注:您很少想调用 reserve()vector 维护自己的内部存储的方式总是按指数方式分配比实际需要更多的内存,以避免频繁resizes/copying 当频繁追加元素时。)

resize() 不是慢操作。它与任何内存分配一样快。

my_struct 是否有一个非平凡的默认构造函数?删除它并手动进行初始化。这可能就是您说 resize() 很慢的原因。它实际上会构建你的对象。但是,由于您显然可以 memcpy() 您的对象,因此您可能可以使用一个简单的(空的)默认构造函数。

你的代码片段有未定义的行为,你不能 memcpy 到一个空向量,即使你有 reserved space。它也可能是 memcpy any my_struct 对象的未定义行为,如果它不是 TriviallyCopyable 类型。

您可以直接将矢量构造为源的副本。 很可能 如果 my_struct 是 TriviallyCopyable,您的编译器将发出与原始代码段相同(或更快)的代码。

std::vector<my_struct> destination_vector(original_vector.begin(), original_vector.begin() + container_length);

How to manually assign vector's size?

你不能。只能通过插入、清除、调整大小等添加或删除元素的修改函数来修改向量的大小

After the code above I need to tell my destination_vector what size it is. How do I do this?

上面提到的代码有未定义的行为,所以你在它之后做什么并不重要。

复制向量的一种简单有效的方法是:

std::vector<my_struct> destination_vector(original_vector);