2013-11-13 2 views
1

Мой контейнер случайным образом доступен, например. станд :: вектор. Мне нужен «индексированный итератор подмножества» моего контейнера. Я написал это имя. Идея такова:Индексированный поднабор итератора в Boost C++

Подмножество моего контейнера задается набором индексов, например. [0, 4, 5, 7] (размер моего контейнера больше 7), я хочу итератор по этому подмножеству.

Ниже псевдо коды:

std::vector<std::string> v = boost::assign::list_of("Aa")("Bb")("Cc")("Dd")("Ee"); 
std::vector<int> subsetIndex = boost::assign::list_of(0)(2)(3); 
IndexedSubsetIterator subsetIterator = IndexedSubsetIterator(v.begin(), subsetIndex); // or templated version 
std::vector<std::string> subset; 
boost::push_back(subset ubsetIterator); 

мне интересно, если есть простой способ сделать это в STL или повысить? Пример кода, пожалуйста, оцените.

Большое спасибо.

ответ

2

Это то, что permutation_iterator от Boost для. Вы строите один из итератора в исходный и итератор в контейнер индекса. Вот работоспособный пример:

#include <vector> 
#include <iostream> 
#include <algorithm> 
#include <boost/iterator/permutation_iterator.hpp> 
#include <boost/assign/list_of.hpp> 

int main() 
{ 
    std::vector<std::string> v = 
     boost::assign::list_of("Aa")("Bb")("Cc")("Dd")("Ee"); 
    std::vector<int> subsetIndex = 
     boost::assign::list_of(0)(2)(3); 

    auto it_begin = 
     boost::make_permutation_iterator(v.begin(), subsetIndex.begin()); 
    auto it_end = 
     boost::make_permutation_iterator(v.end(), subsetIndex.end()); 

    std::vector<std::string> subset; 
    std::copy(it_begin, it_end, std::back_inserter(subset)); 

    for (const auto& s : subset) std::cout << s << '\n'; 
} 

Выход:

Aa 
Cc 
Dd 
+0

именно то, что я хочу. Спасибо. – menrfa

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