1、1+n、2、2+n、3、3+n、4、4+n等。
例如,在n=6中,添加的顺序是: 1,7,2,8等等。
一旦被填充,我想重新排序我的向量的内容到1,2,3等等。
有人能建议我怎么做吗?我情不自禁地想,有些可爱的、优雅的方法是我力所能及的。
发布于 2013-12-02 13:10:20
在朋友们的帮助下@Boost:
typedef std::vector<int> V;
V const v { 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15, 8, 16 };
auto rearranged = copy_range<V>(join(
v | strided(2),
v | sliced(1, v.size()) | strided(2)));看吧,住在Coliru
#include <boost/range/adaptors.hpp>
#include <boost/range/join.hpp>
#include <boost/range/algorithm.hpp>
using namespace boost::adaptors;
using boost::copy_range;
#include <iostream>
int main() {
typedef std::vector<int> V;
V const v { 1, 9, 2, 10, 3, 11, 4, 12, 5, 13, 6, 14, 7, 15, 8, 16 };
auto rearranged = copy_range<V>(join(
v | strided(2),
v | sliced(1, v.size()) | strided(2)));
// print the result
boost::copy(rearranged, std::ostream_iterator<int>(std::cout,";"));
}打印
1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;发布于 2013-12-02 12:58:09
由于向量的大小为2n,所以在填充时可以相应地更改索引。
index = (i%2) ? i/2+n+1 : i/2+1;其中i = 0 to 2n-1
当得到n的值时,将向量声明为
std::vector<myType> vec( 2*n );发布于 2013-12-02 13:01:43
从当前位置映射到适当位置的功能非常容易。
fn(int x,int n) { (i%2) ? i/2+n+1 : i/2+1; }声明一个包含默认内容的新向量。他们之间的循环在做交换。
for(i=0,i<size;i++) {swap(v1[i],v2[fn(i,n)]);} 当然,这可能有一个严重的问题,因为您的描述是基于1,而不是基于零的类似向量。
https://stackoverflow.com/questions/20328867
复制相似问题