带有两个迭代器的循环置换

时间:2014-12-17 18:07:51

标签: c++ iterator iterator-traits

我需要对列表进行循环排列,例如我有:(a,b,c,d,e)我想要(e,a,b,c,d)。但是我没有成功,在这里我尝试了:

#ifndef ALGORITHME_H
#define ALGORITHME_H

template<typename I>  
void permutationCirculaire(I first, I last) {
    typename std::iterator_traits<I>::value_type firstElement = *first;
    typename std::iterator_traits<I>::value_type res;
    I tmp = first;

    for (++first; tmp != last; ++tmp) {
        *first = *tmp;
        std::cout << "tmp : " << *tmp << ", first : " << *first << std::endl;
        ++first;
    }


}

#endif

我明白了: tmp:a,first:a tmp:a,first:a tmp:a,first:a tmp:a,first:a tmp:a,first:a

我不知道为什么,我的主要人物:

#include <iostream>
#include <list>
#include "algorithme.h"

using namespace std;

int main() {    
    list<char> liste;
    liste.push_back('a');
    liste.push_back('b');
    liste.push_back('c');
    liste.push_back('d');
    liste.push_back('e');

    cout << "( ";
    for (list<char>::iterator it = liste.begin(); it != liste.end(); ++it) {
        cout << *it << " ";
    }
    cout << ") " << endl;

    cout << "Permutation : " << endl;
    permutationCirculaire(liste.begin(),liste.end());

    cout << "( ";
    for (list<char>::iterator it = liste.begin(); it != liste.end(); ++it) {
        cout << *it << " ";
    }
    cout << ") " << endl;

    return 0; 
}

如果你知道为什么不犹豫......

4 个答案:

答案 0 :(得分:1)

正如jaunchopanza rotate所提到的那样,你应该使用它。

所以替换这个:

cout << ") " << endl;

cout << "Permutation : " << endl;
permutationCirculaire(liste.begin(),liste.end());

cout << "( ";

有了这个:

rotate(liste.begin(), advance(liste.begin(), liste.size() - 1), liste.end());

注意通过更改advance来电中的号码来调整您旋转的字符数 size() - 1旋转

  

a,b,c,d,e

  

e,a,b,c,d

如果你使用说2而不是size() - 1,你会得到:

  

c,d,e,a,b

如果您想要执行旋转以外的操作,请考虑:next_permutationprev_permutation

答案 1 :(得分:0)

如果你需要做的就是将最后一个元素移到列表的前面,你可以使用:

liste.push_front(liste.back());
list.pop_back();

如果你真的想要使用一个使用迭代器的函数,我会向后遍历列表并交换将最后一个元素放在前面的元素。

template<typename I>  
void permutationCirculaire(I first, I last)
{
    --last;  // move last to the last element
    while(first != last)
    {
        iter_swap(last, last - 1);
        --last;
    }
}

答案 2 :(得分:0)

以前的答案是所做的。特别是你的代码,有几个问题;一个是:在你的for循环中,你先提前增加并终止于temp!= last,如果你有1号列表会怎么样?你的第一个==结束,你做* first = * temp也会在* first = * temp之前将你的cout语句移动一行,这样你就可以得到你想要的输出。

答案 3 :(得分:0)

我终于成功解决了我的问题,这是我的解决方案,感谢大家的帮助:

template<typename I>  
void permutationCirculaire(I first, I last) {
    typename std::iterator_traits<I>::value_type current = *first;
    typename std::iterator_traits<I>::value_type save = *(--last);

    for(; first != last; ++first) {
        current = *first;
        *first = save;
        save = current;
    }
    *first = save;
}

再次抱歉错误。