vector <vector <T >>中每个向量的第n个元素上的迭代器

时间:2019-08-07 02:06:41

标签: c++ algorithm iterator

假设我有一些T类型的向量,即vector<vector<T>> vec的向量。

现在,我想对每个嵌套向量的第n个元素执行一些STL算法。例如,我只想对每个向量的第n个元素进行排序,而所有其他元素都保持不变。

要执行此操作,我需要某种迭代器,以便它将对嵌套向量进行迭代,但是取消引用迭代器将产生向量的第n个元素。这是一种合理的方法吗?如果是,是否存在任何现有的实现?最好在STL中。

动机:我需要对嵌套矢量执行一些STL算法,但不能使用任何多余的空间。

示例:Adaptor<N>(It iterator)是我们想要的迭代器类,它是嵌套数组中位置N处的元素的迭代器,并在返回的迭代器上调用next将我们带到下一个嵌套数组中位置N处的元素。

vector<vector<int>> vec {{1,3,2}, {4,1,10}, {3,3,3}, {9,8,7}}
sort(Adaptor<2>(vec.begin()), Adaptor<2>(vec.end()));

将产生vec

{{1,3,2}, {4,1,3}, {3,3,7}, {9,8,10}}

1 个答案:

答案 0 :(得分:2)

如果您可以使用Boost,boost::iterator_adaptor可以使其易于实施:

Live On Coliru

#include <boost/iterator/iterator_adaptor.hpp>
#include <type_traits>

template<std::size_t N,typename Iterator>
class nth_iterator:
  public boost::iterator_adaptor<
    nth_iterator<N,Iterator>,Iterator,
    std::remove_reference_t<decltype((*std::declval<Iterator>())[N])>
  >
{
public:
  nth_iterator()=default;
  nth_iterator(const Iterator& it):nth_iterator::iterator_adaptor_{it}{}
  nth_iterator(const nth_iterator&)=default;
  nth_iterator& operator=(const nth_iterator&)=default;

private:
  friend class boost::iterator_core_access;

  decltype(auto) dereference()const
  {
    return (*this->base_reference())[N];
  }
};

template<std::size_t N,typename Iterator>
auto nth(Iterator it)
{
  return nth_iterator<N,Iterator>(it);
}

#include <algorithm>
#include <iostream>
#include <vector>

int main()
{
  std::vector<std::vector<int>> vec{{1,3,2}, {4,1,10}, {3,3,3}, {9,8,7}};

  auto print_vec=[&]{
    std::cout<<"{";
    const char* delim1="";
    for(auto&& x:vec){
      std::cout<<delim1<<"{";
      delim1=", ";
      const char* delim2="";
      for(auto&& y:x){
        std::cout<<delim2<<y;
        delim2=",";
      }
      std::cout<<"}";
    }
    std::cout<<"}\n";
  };

  print_vec();
  std::sort(nth<2>(vec.begin()),nth<2>(vec.end()));
  print_vec();  
}

输出

{{1,3,2}, {4,1,10}, {3,3,3}, {9,8,7}}
{{1,3,2}, {4,1,3}, {3,3,7}, {9,8,10}}