Iterator对矢量对,并使用std :: copy打印结果

Avr*_*dis 0 c++ iterator c++11

我有以下向量:

std::vector<std::pair<int,std::string>> songs;

我想使用std :: copy将向量中的元素(比如说int)传递给ostream,类似于以下哪些方法不起作用:

std::copy(songs.begin(),songs.end(),std::ostream_iterator<int>(std::cout,""));

我知道我可以这样做:

for(auto it=songs.begin(); it!=songs.end(); ++it)
    {
      std::cout << (*it).first;
    }
Run Code Online (Sandbox Code Playgroud)

但我想知道在C++中是否有可能创建一个迭代器,它只指向该对中的一个元素,然后使用它来迭代并将元素复制到ostream或者如何使std :: copy上面工作?

Pra*_*ian 5

正如克里斯在评论中提到的,最简单的解决方案是使用std::transform

std::transform( songs.begin(), songs.end(), 
                std::ostream_iterator<int>( std::cout, "\n" ),
                []( decltype(v)::value_type const& p ) -> decltype(p.first) {
                    return p.first;
                }
              );
Run Code Online (Sandbox Code Playgroud)

如果要转到自定义迭代器路径,请创建一个模仿ostream_iterator行为的类型,另外用于std::get仅检索您关注的项目.

template<std::size_t N>
struct get_tuple_item_iterator
: public std::iterator<std::output_iterator_tag, void, void, void, void>
{   
    get_tuple_item_iterator( std::ostream& os, std::string term )
    : os_(os)
    , term_(std::move(term))
    {}

    template<typename... T>
    get_tuple_item_iterator& operator=( std::tuple<T...> const& elem )
    {
        static_assert(N < sizeof...(T), "N is out of range");
        os_ << std::get<N>( elem ) << term_;
        return *this;
    }

    template<typename T1, typename T2>
    get_tuple_item_iterator& operator=( std::pair<T1, T2> const& elem )
    {
        static_assert((N == 0) || (N == 1), "N must be 0 or 1 for std::pair");
        return operator=( std::tie( elem.first, elem.second ) );
    }

    get_tuple_item_iterator& operator*() { return *this; }
    get_tuple_item_iterator& operator++() { return *this; }
    get_tuple_item_iterator& operator++( int ) { return *this; }

private:
    std::ostream& os_;
    std::string term_;
};
Run Code Online (Sandbox Code Playgroud)

用它作为

std::copy( songs.begin(), songs.end(), 
           get_tuple_item_iterator<0>( std::cout, "\n" ) );
Run Code Online (Sandbox Code Playgroud)