std :: copy_n不会更改目标向量大小

Pie*_*tro 4 c++ copy stdvector stl-algorithm c++11

如果我为一个向量保留了一些空间,然后我用它复制了一些值std::copy_n(),我得到正确复制并可访问的值,但向量的大小仍为零.这是预期的行为吗?我应该调整矢量大小,即使它没有效率吗?

#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] << "  ";

}
Run Code Online (Sandbox Code Playgroud)

编译器测试:clang,gcc,Visual C++

son*_*yao 5

但是矢量的大小仍然为零

std::copy_n不会改变容器的大小,只需复制值并迭代迭代器; 它甚至没有关于容器的任何信息.因此代码具有未定义的行为,即使它似乎工作正常.

我应该调整矢量大小,即使它没有效率吗?

是的,您可以使用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));
Run Code Online (Sandbox Code Playgroud)