2012-01-22 2 views
2

Как я могу получить первые N элементов из многомножествой структуры, не постоянно получая первый (.begin()) элемент, а затем стирая его?Получить первые N элементов в мультимножестве C++

Я просто хочу суммировать первые элементы N, не затрагивая мультимножество.

ответ

4

Я просто хочу суммировать первые элементы N, не затрагивая мультимножество.

#include <numeric> 
#include <iterator> 

// ... 

int sum = std::accumulate(my_set.begin(), std::next(my_set.begin(), N)); 

std::next является библиотека дополнением C++ 11. Вот решение для более старых компиляторов:

std::multiset<int>::iterator it = my_set.begin(); 
std::advance(it, N); 
int sum = std::accumulate(my_set.begin(), it); 

Оба решения повторяют два мультипликатора. Если вы хотите предотвратить это, используйте ручную петлю:

int sum = 0; 
std::multiset<int>::iterator it = my_set.begin(); 
for (int i = 0; i < N; ++i) 
{ 
    sum += *it++; 
} 
+0

В нем говорится, что «следующий» не определено, или что-то вроде – Cristy

+0

@Cristy updated – fredoverflow

+0

Я «решил» проблему, вручную перебирая первые N элементов. – Cristy

1

Вы можете пронестись по multiset, как и с любым другим контейнером, и остановитесь после того, как увидите n элементов.

+0

Если я итерации, я получу элементы на заказ? – Cristy

+0

@Cristy: да, вы это сделаете. – NPE

+0

Спасибо, я попробую это и посмотрю, работает ли оно. : * – Cristy