Mel*_*Mel 6 c++ merge stl vector
我有两个STL向量A和B,需要将它们合并到第三个,其中元素应该以某种方式排序,输出向量中的每个第n个元素应该是向量B.我的当前代码看起来像这样:
std::vector<int> a(10, 4);
std::vector<int> b(10, 8);
std::vector<int> c;
static const std::size_t STEP(3);
std::vector<int>::const_iterator bIt = b.begin();
for(std::vector<int>::const_iterator aIt = a.begin();
aIt != a.end(); ++aIt)
{
c.push_back(*aIt);
if((c.size() + 1) % STEP == 0)
{
c.push_back(*bIt);
++bIt; //assume b is large enough
}
}
Run Code Online (Sandbox Code Playgroud)
矢量c现在看起来像:4 4 8 4 4 8 ...
这很好,但我很好奇,如果没有更优雅的解决方案.有没有办法使用STL算法而不是我的手写循环?
这太专业了,无法直接涵盖<algorithm>。避免循环将需要自定义迭代器。
template< typename I1, typename I2 >
struct interleave_iterator
: std::iterator< forward_iterator_tag, typename I1::value_type > {
using typename I1::value_type;
I1 i1;
I2 i2;
size_t cnt, stride;
interleave_iterator( I1 in1, I2 in2, size_t in_stride=0, size_t in_off=0 )
: i1( in1 ), i2( in2 ), cnt( in_off ), stride( in_stride ) {}
value_type &operator*() const { return cnt? * i1 : * i2; }
interleave_iterator &operator++() {
if ( ++ cnt == stride ) {
cnt = 0;
++ i2;
} else ++ i1;
return *this;
}
value_type *operator->() const
{ return cnt? i1.operator->() : i2.operator->(); }
interleave_iterator &operator++(int)
{ interleave_iterator r = *this; ++ *this; return r; }
friend bool operator==
( interleave_iterator const &lhs, interleave_iterator const &rhs )
{ return lhs.i1 == rhs.i1 && lhs.i2 == rhs.i2; }
friend bool operator!=
( interleave_iterator const &lhs, interleave_iterator const &rhs )
{ return ! ( lhs == rhs ); }
};
Run Code Online (Sandbox Code Playgroud)
我觉得有点过分了。
| 归档时间: |
|
| 查看次数: |
2157 次 |
| 最近记录: |