1

我想std::accumulatemap<int,int>地图的前 3 个元素上使用。这不起作用,你能指出我的错误吗?

int main(){
    map<int, int> m;
    m[1] = 1;
    m[2] = 2;
    m[3] = 4;
    m[4] = 8;
    struct pair_add {
      int operator()(int i, const std::pair<int, int>& x) {
        return i + x.second;
      }
    };
    int cumSumQty = accumulate(m.begin(), m.end, 0, pair_add()); //THIS COMPILE
    int cumSumQty = accumulate(m.begin(), m.begin()+3, 0, pair_add()); //THIS DOES NOT
}
4

3 回答 3

4

std::map迭代器不是随机访问,所以这

m.begin() + 3

是非法的。您可以std::next改用:

std::next(m.begin(), 3);

用法:

int cumSumQty = accumulate(m.begin(), std::next(m.begin(), 3), 0, pair_add());
于 2013-07-02T09:39:04.723 回答
3

Map 没有随机访问迭代器,您不能使用+它。

用作std::advance

auto it = m.begin();
std::advance(it,3);
int cumSumQty = accumulate(m.begin(), it , 0, pair_add()); 

或者,更好地std::next用作:

int cumSumQty = accumulate(m.begin(), std::next(m.begin(), 3) , 0, pair_add()); 

因为std::map::iteratoris BidirectionalIterator,所以你甚至可以这样做:

int cumSumQty = accumulate(std::next(m.end(),-3), m.end(), 0, pair_add());

希望有帮助。

于 2013-07-02T09:38:03.660 回答
1

使用 std::advance。std::map 的迭代器不是随机访问迭代器,因此添加偏移量不起作用。但是,我也会考虑编写一个简单的 for 循环,或者甚至只是为三个元素拼写出来。

于 2013-07-02T09:38:14.577 回答