如何以正确的方式在std算法中使用容器邻居

时间:2014-04-14 14:50:13

标签: c++ algorithm c++11

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)。 这是使用标准算法的正确方法吗?如果是,那么哪些算法设计用于这种方式?

2 个答案:

答案 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的输出序列的第一个元素等于输入的第一个元素;所以你需要跳过它。