c++ - 按模式分割 vector

标签 c++ c++11 c++14

我有一个 vector “a”,其中包含大量数据,应该分成两个单独的 vector “b”和“c”。

vector<unsigned char> a; //contains a lot of data

vector<unsigned char> b; //data should be split into b and c
vector<unsigned char> c;

vector 'a'中的数据布局如下:

bbbbccccbbbbccccbbbbcccc

前 4 个字节应放入 vector “b”,接下来的 4 个字节应放入 vector “c”,依此类推。

我可以遍历我的数据并将每个元素 push_back(或插入)到相应的 vector 中(基于它们在 vector “a”中的索引)。但是,我试过了,结果很慢。

在 C++ 中是否有更高效的方法来实现这一目标?

最佳答案

尝试预先分配您将要使用的内存以避免复制。假设 a 包含完整序列,您可以:

b.reserve(a.size() / 2);
c.reserve(a.size() / 2);
for (auto it = a.begin(); it < a.end(); it += 8) {
  b.insert(b.end(), it, it + 4);
  c.insert(c.end(), it + 4, it + 8);
}

更新

如果您不介意修改原始 vector a,您可以使用它来保留其中一个子序列并避免分配更多内存。假设 a 包含完整序列:

b.reserve(a.size() / 2);
auto writer = a.begin();
for (auto reader = a.cbegin(); reader < a.cend(); reader += 8, writer += 4) {
  b.insert(b.end(), reader, reader + 4);
  std::copy(reader + 4, reader + 8, writer);
}
a.resize(a.size() / 2);

关于c++ - 按模式分割 vector ,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32568124/

相关文章:

c++ - `for_each_arg` 的正确用法 - 转发过多?

python - 如何无陷阱地实现简单的请求-响应技术

c++ - Xcode 4.2 和 lambda 表达式 (OSX Lion)

c++ - 一个简单的 C++11 宏

c++ - 何时使用 =default 与 =delete

c++ - 涉及std::equal_range的无效操作数编译器错误

c++ - 如何将 GLEW 构建为 CMake 项目的一部分

c++ - OpenCV 3.0 上的 GPU 功能在哪里?

c++ - 我的代码通过了测试用例,但是在我提交时显示了错误的答案

C++11 - 清除返回值语法和 decltype 关键字