1

我的容器是随机访问的,例如 std::vector。我需要一个容器的“索引子集迭代器”。我编了这个名字。这个想法是:

我的容器的一个子集由一组索引给出,例如 [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 或 boost 中是否有一种简单的方法可以做到这一点?示例代码请赞赏。

非常感谢。

4

1 回答 1

2

这就是Boost 的permutation_iterator的用途。您构造一个从迭代器到源的迭代器和一个从迭代器到索引容器的迭代器。这是一个可运行的示例:

#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
于 2013-11-13T15:33:42.463 回答