流迭代器 - 字节流

时间:2015-08-25 04:08:47

标签: c++ c++11

使用istream_iterator可以轻松地将文件读入字节数组。

例如:

std::ifstream afile(somefile);
noskipws(afile);
...
std::vector<uint_8> vOfBytes = { std::istream_iterator<uint8_t>(afile),
                                 std::istream_iterator<uint8_t>() };

我现在需要能够对矢量和字符串做同样的事情。问题是这些尺寸非常大。

例如:

std::string astring = "abc";
std::wstring awstring = L"abc";
std::vector avector<uint32_t> = { 0, 1, 2, 3 };

// std::distance(asv.begin(), asv.end()) == 3
std::vector<uint8_t> asv = { /* astring to std::vector<uint8_t> */ }; 

// std::distance(awsv.begin(), awsv.end()) == 6
std::vector<uint8_t> awsv = { /* awstring to std::vector<uint8_t> */ };

// std::distance(uiv.begin(),uiv.end()) == 16
std::vector<uint8_t> uiv = { /* avectorto std::vector<uint8_t>*/};

我一直在查看cpp引用,并且没有遇到过将上面视为不必滚动我自己的流的字节流的方法。 有没有人有任何可以指向我的建议或参考?我将不胜感激。

1 个答案:

答案 0 :(得分:3)

您可以使用完全相同的迭代器构造函数

#include <string>
#include <vector>
#include <iostream>

int main()
{
  std::string astring = "abc";
  std::wstring awstring = L"abc";
  std::vector<uint32_t> avector{ 0, 1, 2, 3 };

  std::vector<uint8_t> asv{
    reinterpret_cast<uint8_t const*>(astring.data()),
    reinterpret_cast<uint8_t const*>(astring.data() + astring.size()),
  }; 

  std::vector<uint8_t> awsv{
    reinterpret_cast<uint8_t const*>(awstring.data()),
    reinterpret_cast<uint8_t const*>(awstring.data() + awstring.size()),
  }; 

  std::vector<uint8_t> uiv{
    reinterpret_cast<uint8_t const*>(avector.data()),
    reinterpret_cast<uint8_t const*>(avector.data() + avector.size()),
  };

  std::cout << std::hex;

  for (auto v : asv)
    std::cout << static_cast<int>(v) << ' ';
  std::cout << '\n';
  for (auto v : awsv)
    std::cout << static_cast<int>(v) << ' ';
  std::cout << '\n';
  for (auto v : uiv)
    std::cout << static_cast<int>(v) << ' ';
  std::cout << '\n';
}