std算法是否设计为在容器中使用多个邻居元素?
这里我从文件中读取样本(每个样本都有自己的偏移量)
long offsets[] = { 0x00000000, 0x00000010, 0x00000020, .... }
ifstream file(path, ios::binary);
vector<sample> samples;
for_each(begin(offsets), end(offsets), [](long &offset){
auto sampleSize = *(&offset+1)-offset;
sample s;
file.read( s.GetBuffer(), sampleSize);
samples.push_back(s);
});
为了计算尺寸,我需要来自矢量的两个相邻元素。我也认为我可以使用std :: advance()或std :: next()而不是*(&amp; offset + 1)。 这是使用标准算法的正确方法吗?如果是,那么哪些算法设计用于这种方式?
答案 0 :(得分:1)
使用boost zip迭代器,您可以执行以下操作:
// assume that offsets is not empty.
std::for_each(
boost::make_zip_iterator(boost::make_tuple(begin(offsets), begin(offsets + 1))),
boost::make_zip_iterator(boost::make_tuple(end(offsets) - 1, end(offsets))),
[&](const boost::tuple<const long&, const long&>& t) {
auto sampleSize = t.get<1>() - t.get<0>();
sample s;
file.read(s.GetBuffer(), sampleSize);
samples.push_back(s);
}
);
答案 1 :(得分:0)
这正是std::adjacent_difference的工作,例如
long offsets[] = { 0x00000000, 0x00000010, 0x00000020, 0x00000030 };
std::vector<long> diff(end(offsets) - begin(offsets));
std::adjacent_difference(begin(offsets), end(offsets), diff.begin());
ifstream file(path, ios::binary);
vector<sample> samples;
for_each(diff.begin() + 1, diff.end(), [&](long size){
sample s;
file.read(s.GetBuffer(), size);
samples.push_back(s);
});
或者,如果您不再需要offsets
,则可以覆盖它:
long offsets[] = { 0x00000000, 0x00000010, 0x00000020, 0x00000030 };
std::adjacent_difference(begin(offsets), end(offsets), begin(offsets));
ifstream file(path, ios::binary);
vector<sample> samples;
for_each(begin(offsets) + 1, end(offsets), [&](long size){
sample s;
file.read(s.GetBuffer(), size);
samples.push_back(s);
});
+ 1
是必需的,因为std::adjacent_difference
的输出序列的第一个元素等于输入的第一个元素;所以你需要跳过它。