基于设定模式重新排序向量的成员

时间:2013-12-02 12:53:57

标签: c++ vector stdvector

我有一个常量为2n的std :: vector,它的内容 - 更多的向量 - 按此顺序添加(不能更改): 1,1 + n,2,2 + n,3,3 + n,4,4 + n等。

例如,在n = 6的情况下,添加的顺序为:1,7,2,8等。

一旦填充,我想将我的矢量内容重新排序为1,2,3等。

有人可以建议我怎么做吗?我不禁想到有一些可爱的优雅方法,这是我无法企及的。

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)));

查看 Live At 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;

答案 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的,而不是像矢量那样基于零,所以这可能会严重影响一个问题。