gpt4 book ai didi

c++ - std::copy_n 不改变目标 vector 大小

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:27:06 25 4
gpt4 key购买 nike

如果我为 vector 保留一些空间,然后使用 std::copy_n() 在其中复制一些值,我会正确复制并访问这些值,但是 vector 的大小仍然为零。这是预期的行为吗?我是否应该改为调整 vector 的大小,即使它效率不高?

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
std::vector<double> src, dest;

for(double x = 0.0; x < 100.0; ++x)
src.push_back(x);

dest.reserve(src.size());

std::copy_n(src.cbegin(), src.size(), dest.begin());

std::cout << "src.size() = " << src.size() << std::endl;
std::cout << "dest.size() = " << dest.size() << std::endl;

for(size_t i = 0; i < src.size(); ++i)
std::cout << dest[i] << " ";

}

测试的编译器:clang、gcc、Visual C++

最佳答案

but the size of the vector is still zero

std::copy_n 不会改变容器的大小,只是复制值并步进迭代器;它甚至没有关于容器的任何信息。所以代码有未定义的行为,即使它看起来工作正常。

Should I resize the vector instead, even if it is not as efficient?

是的,您可以使用 std::vector::resize 而不是 std::vector::reserve 来解决这个问题。正如您所想的,这意味着所有元素将首先通过resize 构建,然后通过copy_n 分配。

你可以使用 std::back_inserter ,它将通过调用容器的 push_back() 成员函数(即直接构造元素)在容器的末尾追加元素,从而增加容器的大小。例如

dest.reserve(src.size());
std::copy_n(src.cbegin(), src.size(), std::back_inserter(dest));

关于c++ - std::copy_n 不改变目标 vector 大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42042526/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com