我有一个 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/