我有一个常量为2n的std :: vector,它的内容 - 更多的向量 - 按此顺序添加(不能更改): 1,1 + n,2,2 + n,3,3 + n,4,4 + n等。
例如,在n = 6的情况下,添加的顺序为:1,7,2,8等。
一旦填充,我想将我的矢量内容重新排序为1,2,3等。
有人可以建议我怎么做吗?我不禁想到有一些可爱的优雅方法,这是我无法企及的。
答案 0 :(得分:3)
在朋友的帮助下@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)));
#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;
答案 1 :(得分:1)
由于向量的大小为2n,因此在填充时可以相应地更改索引。
index = (i%2) ? i/2+n+1 : i/2+1;
i = 0 to 2n-1
当你得到n的值时,将你的向量声明为
std::vector<myType> vec( 2*n );
答案 2 :(得分:0)
从当前位置映射到适当位置的功能非常简单。
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的,而不是像矢量那样基于零,所以这可能会严重影响一个问题。