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++
但是矢量的大小仍然为零
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)
| 归档时间: |
|
| 查看次数: |
573 次 |
| 最近记录: |