C++ 如何避免在附加到vector时调用memcpy()<;数组<;char,N>>;?

C++ 如何避免在附加到vector时调用memcpy()<;数组<;char,N>>;?,c++,c++11,std,C++,C++11,Std,下面的代码读取1024字节块(块)中的二进制文件,将其保存到vector中,最后打印每个块的第一个字节: #include <iostream> #include <fstream> #include <vector> #include <array> #include <iomanip> #include "string.h" using namespace std; int main() { vecto

下面的代码读取1024字节块(块)中的二进制文件,将其保存到
vector
中,最后打印每个块的第一个字节:

#include <iostream>
#include <fstream>
#include <vector>
#include <array>
#include <iomanip>
#include "string.h"

using namespace std;

int main()
{
   vector<array<char,1024>> blocks;
   vector<char> buffer(1024,0);

   ifstream input("./video.mp4", std::ifstream::binary);

   while( !input.eof() ) {
      input.read( buffer.data(), buffer.size() );
      auto size = input.gcount();

      array<char,1024> aa;
      memcpy( aa.data(), buffer.data(), size );

      blocks.push_back( aa );
   }

   for( auto b: blocks ) {
      cout<<hex<<setw(2)<<setfill('0')<<(int)(uint8_t)b[0]<<'\n';
   }
}
#包括
#包括
#包括
#包括
#包括
#包括“string.h”
使用名称空间std;
int main()
{
向量块;
向量缓冲区(1024,0);
ifstream输入(“./video.mp4”,std::ifstream::binary);
而(!input.eof()){
input.read(buffer.data(),buffer.size());
自动大小=input.gcount();
阵列aa;
memcpy(aa.data(),buffer.data(),size);
块。推回(aa);
}
用于(自动b:块){
库特
这将用读取的数据填充最后一个块,然后将其余的数据置零。如果引发异常,它将提供强异常保证


块的内存呈指数级增长,给你一个常数因子的超额分配和一个摊销的线性字节数。如果你知道有多少块(甚至有一个很好的猜测)你可以事先保留。

你可以使用std::copy。但是直接在向量中创建一个块,然后填充它也可能更好。你也可能想分块读取,但要连续存储数据,不是吗?你能解释一下使用临时的
向量
可以完成什么吗?你不能简单地通过重新创建来完成吗首先把每个块都放进<代码>数组<代码>!POFE!不需要任何地方都能记住!是的,我想它会更直接地读出来,我必须尝试一下。我只是想刷新我的C++,却不知道我是否有<代码> char */Cube >如何使用<代码> STD< /Cord>
  block.emplace_back();
  try {
    input.read( block.back().data(), block.back().size() );
    auto size = input.gcount();
    std::fill_n(block.back().data()+size, block.back().size()-size, '\0' );
  } catch(...) {
    block.resize(block.size()-1);
    throw;
  }