首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >基于集合模式对向量成员进行重新排序

基于集合模式对向量成员进行重新排序
EN

Stack Overflow用户
提问于 2013-12-02 12:53:56
回答 3查看 107关注 0票数 0

1、1+n、2、2+n、3、3+n、4、4+n等。

例如,在n=6中,添加的顺序是: 1,7,2,8等等。

一旦被填充,我想重新排序我的向量的内容到1,2,3等等。

有人能建议我怎么做吗?我情不自禁地想,有些可爱的、优雅的方法是我力所能及的。

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-12-02 13:10:20

在朋友们的帮助下@Boost:

代码语言:javascript
复制
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

代码语言:javascript
复制
#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,";"));
}

打印

代码语言:javascript
复制
1;2;3;4;5;6;7;8;9;10;11;12;13;14;15;16;
票数 3
EN

Stack Overflow用户

发布于 2013-12-02 12:58:09

由于向量的大小为2n,所以在填充时可以相应地更改索引。

代码语言:javascript
复制
index = (i%2) ? i/2+n+1 : i/2+1;

其中i = 0 to 2n-1

当得到n的值时,将向量声明为

代码语言:javascript
复制
std::vector<myType> vec( 2*n );
票数 1
EN

Stack Overflow用户

发布于 2013-12-02 13:01:43

从当前位置映射到适当位置的功能非常容易。

代码语言:javascript
复制
fn(int x,int n) { (i%2) ? i/2+n+1 : i/2+1; }

声明一个包含默认内容的新向量。他们之间的循环在做交换。

代码语言:javascript
复制
for(i=0,i<size;i++) {swap(v1[i],v2[fn(i,n)]);} 

当然,这可能有一个严重的问题,因为您的描述是基于1,而不是基于零的类似向量。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20328867

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档