假设我有一些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}}
答案 0 :(得分:2)
如果您可以使用Boost,boost::iterator_adaptor
可以使其易于实施:
#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}}