2013-12-09 3 views
1

Как известно большинству людей, Set Container на C++ обычно реализуется как красно-черное дерево, а при итерации по контейнеру записи выходят в порядок, и это может быть использовано.Red Black tree with pagenation

Я бы, однако, хотел бы сделать pagenation на итерации контейнера, forinstance если контейнер containes:

set<int> set; 
// insert some data 
for(auto s : set) 
    cout << s << " " << endl; 

1, 3, 5, 7, 9, 11, 13, 15 

Я хотел бы йи запрос диапазона на контейнер range(2,5) yealding: вектор 3, 5, 7, это кажется невозможным делать с множеством, можно ли разбивать страницы на любой из контейнеров STL, или это случай, когда вы должны реализовать его самостоятельно?

+1

Ok, теперь, когда я понимаю ваш вопрос (я думаю), будет [ 'станд: next'] (HTTP://en.cppreference.com/w/cpp/iterator/next) и/или ['std :: advance'] (http://en.cppreference.com/w/cpp/iterator/advance) на основе' std: : begin (s) 'предоставить вам то, что вы ищете? Я * думаю * может. – WhozCraig

+0

Я сомневаюсь, что вы найдете способ сделать это, принимая меньше, чем линейное время в стандартной библиотеке, но это не сложно реализовать самостоятельно. – Dukeling

ответ

1

Для индексирования есть только один способ http://www.cplusplus.com/reference/iterator/advance/ Но он имеет линейную временную сложность

set<int>::iterator lower = s.begin(); 
std::advance(lower, 2); 
auto upper = lower; 
std::advance(upper, 6-2); 
std::copy(lower, upper, std::ostream_iterator<int>(std::cout, " ")); 
+2

Да, я пошел туда. он ищет диапазон через индексную позицию; не элемент-значение. – WhozCraig

+1

Да, я скорректировал ответ – weisert

+0

, но это все равно линейно в аргументе advance, это должно выполняться во время журнала, но может потребовать информацию, которая не хранится в базовом rb_tree. –

Смежные вопросы