C ++按以下顺序切换数组顺序的算法:[Last,First,Last - 1,First + 1 ...]

时间:2016-02-18 09:11:48

标签: c++ arrays algorithm c++11 iterator

如何仅使用循环实现此类功能?

我打破了我的脑袋,我似乎无法直接思考。

这就是我提出的建议,但它甚至没有任何关闭。

for (int i = 0; i < elements; i++)
{
    for (int n = elements; n > 0; --n)
        a[i] = b[n];
}

6 个答案:

答案 0 :(得分:7)

你在这里

chart7.Series["Series3"].ChartType = SeriesChartType.Line;
chart7.Series["Series3"].Points.DataBindXY(xVal, arrDouble3);

foreach (Series series in chart7.Series)
{
   foreach (DataPoint arrP in series.Points)
   {
       if (arrP.YValues.Length > 0 && (double)arrP.YValues.GetValue(0) == 0)
       { 
            arrP.IsValueShownAsLabel = false;                   
       }
    }
 }

 chart7.Series["Series3"].Points.DataBindXY(xVal, arrP);    ????

程序输出

#include <iostream>
#include <algorithm>
#include <iterator>

int main()
{
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    for ( int x : a ) std::cout << x << ' ';
    std::cout << std::endl;

    for ( auto it = std::begin( a ); it != std::end( a ); it == std::end( a ) ? it : ++it )
    {
        it = std::rotate( it, std::prev( std::end( a ) ), std::end( a ) );
    }        

    for ( int x : a ) std::cout << x << ' ';
    std::cout << std::endl;
}        

编译器应支持C ++ 11算法0 1 2 3 4 5 6 7 8 9 9 0 8 1 7 2 6 3 5 4

P.S。我更改了循环的第三个表达式,它对于具有奇数个元素的序列是正确的。

另一种方法是使用标准算法std::rotate 类似于以下内容

std::copy_backward

程序输出

#include <iostream>
#include <algorithm>
#include <iterator>

template <class BidirectionalIterator>
void alternate( BidirectionalIterator first, BidirectionalIterator last )
{
    if ( first != last && first != --last )
    {
        while ( first != last )
        {
            auto value = *last;
            std::copy_backward( first, last, std::next( last ) );
            *first++ = value;
            if ( first != last ) ++first;
        }
    }
}    

int main()
{
    int a[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };

    for ( int x : a ) std::cout << x << ' ';
    std::cout << std::endl;

    alternate( std::begin( a ), std::end( a ) );

    for ( int x : a ) std::cout << x << ' ';
    std::cout << std::endl;
}        

答案 1 :(得分:3)

您可以使用计数器i0转到len / 2。并相应地存储。

伪代码看起来应该是这样的。

len = length of array
counter = 0
For i = 0 to (len / 2):
    a[counter++] = b[len - i]
    a[counter++] = b[0 + i]

答案 2 :(得分:2)

这会起作用吗?...如果你可以使用另一个数组...... a而原始来自b

,这很简单且不复杂
for (int i = 0, i_even = 1, i_odd = 0; i < elements; i++)
{
     if(i % 2 == 0){
         a[i] = b[elements-i_even];
         ++i_even;
     }
     else {
         a[i] = b[i_odd];
         ++i_odd;
}

完整示例:

#include <iostream>
#include <vector>

using namespace std;

vector<int> switched(const vector<int>& b){
    const std::size_t sz = b.size();
    vector<int> a(sz);

    for (int i = 0, i_even = 1, i_odd = 0; i < sz; i++) {
        if(i % 2 == 0) {
            a[i] = b[sz-i_even];
            ++i_even;
        }
        else {
            a[i] = b[i_odd];
            ++i_odd;
        }
    }
    return a;
}

void print(const vector<int>& v){
    for (auto e: v)
        cout << e << " "; cout << endl;
}

int main()
{
    vector<int> b{0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
    print(b);
    print(switched(b));

    return 0;
}

答案 3 :(得分:1)

没有 if

的小解决方案
std::vector<int> a{ 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10 };
std::vector<int> b;

b.reserve(a.size());
size_t l = a.size() - 1;

for (int i = 0; i < a.size(); ++i)
{
    b.push_back( a[(i / 2) + ((i + 1) % 2) * (l - i)] );
}

for (int i = 0; i < b.size(); ++i)
{
    std::cout << b[i] << "\n";
}

它适用于整数运算。

答案 4 :(得分:0)

在我的脑海中,这有效:

a[] = b[];
len= lenght of a;

for(int i=0; i<len/2; i++)
{
     int j = 0;
     a[j] = b[len-i];
     j++;
     a[j] = b[i];
}

请注意,这可能会导致奇数阵列长度出现问题。

答案 5 :(得分:0)

另一种方法是倒退。在位置i结束的元素来自?

dest src 
0    0
1    size-1

2    1
3    size-2

4    2
5    size-3

因此,如果dest为偶数,src=dest/2dest为奇数,src=size-1-(dest/2)

此方法的优点是您不需要奇数长度输入的特殊代码。