c ++循环将向量写入另一个向量

时间:2014-03-09 13:42:48

标签: c++ loops vector

我有一个大小为n的向量V.我想将这个向量重写为另一个向量X,使得X的第一个元素是V的第一个元素,然后X的第二个元素是V的LAST元素,然后是V的第二个元素,然后是V的第二个元素,等等。 是否有智能循环可以做到这一点? 提前谢谢!

对于那些对描述感到困惑的人来说,它基本上要求产生:

X = { V[0], V[n-1], V[1], V[n-2], V[2], .... }

3 个答案:

答案 0 :(得分:0)

为了简单,可读性等,我会做类似的事情:

// split vector (assumes size is even!)
for( i=0; i<(V.size()/2); i++){
   X.push_back(V[i*2]);
   Y.push_back(V[i*2+1]);
}
// copy reversed Y onto X
for( i=Y.size()-1; i>=0; i--)
   X.push_back(Y[i]);

我想你明白了。

答案 1 :(得分:0)

编辑问题后,很明显你可以这样做(对于矢量v)

// function to interleave ranges, you'll see the usage later
template <class InputIterator1, class InputIterator2, class OutputIterator>
  OutputIterator interleave(InputIterator1 first1, InputIterator1 last1,
                        InputIterator2 first2, InputIterator2 last2,
                        OutputIterator result)
{
  while (first1 != last1 || first2 != last2) 
  {
    if (first1==last1) return std::copy(first2,last2,result);
    if (first2==last2) return std::copy(first1,last1,result);

    *result++ = *first1++;
    *result++ = *first2++;
  }
}

int main() // example
{
    std::vector<int> v;
    // fill v with elements
    std::vector<int> result; // this is not an "in place solution"

    interleave(v.begin(), v.end(), v.rbegin(), v.rend(), back_inserter(result));
    // result holds the answer - keep that or assign it back to v
}

这里是use case

答案 2 :(得分:0)

你可以试试这段代码:

#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
using namespace std;

int main() {
// your code goes here
vector<int> vec;

for(int i = 0; i < 10; i++)
    vec.push_back(i);

copy(vec.begin(), vec.end(), ostream_iterator<int>(cout, " "));
cout<<endl;

vector<int> second;
int length = vec.size();
for(int j = 0; j < length/2; j++)
{
    second.push_back(vec[j]);
    second.push_back(vec[length - j - 1]);
}
if(length % 2 == 1)
    second.push_back(vec[length/2]);

copy(second.begin(), second.end(), ostream_iterator<int>(cout, " "));
cout<<endl;
return 0;
}

输出是:

0 1 2 3 4 5 6 7 8 9 
0 9 1 8 2 7 3 6 4 5