【问题标题】:Iterator over a vector of pairs and use std::copy to print the result对向量的迭代器并使用 std::copy 打印结果
【发布时间】:2013-05-21 02:24:51
【问题描述】:

我有以下向量:

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;
    }

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

【问题讨论】:

  • 您可以使用std::transform 返回每​​对的第一个元素。
  • How to retrieve all keys (or values) from a std::map? 的可能副本,它有指向select1st、boost range 的过滤器适配器和boost::transform_iterator 的指针,所有这些都可以用来解决这个问题

标签: c++ c++11 iterator


【解决方案1】:

作为 cmets 中的 chris mentioned,最简单的解决方案是使用 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;
                }
              );

如果您想使用自定义迭代器路线,请创建一个模仿 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_;
};

把它当作

std::copy( songs.begin(), songs.end(), 
           get_tuple_item_iterator<0>( std::cout, "\n" ) );

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-12-26
    • 2020-12-02
    • 1970-01-01
    相关资源
    最近更新 更多