0

我需要对列表进行循环排列,例如我有:(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

4 回答 4

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

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

c、d、e、a、b

next_permutation还要考虑:prev_permutation如果你不想做除了旋转之外的事情。

于 2014-12-17T19:03:56.630 回答
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;
    }
}
于 2014-12-17T19:00:02.927 回答
0

以前的答案是你应该做的。特别是您的代码,有几个问题;一个是:在你的 for 循环中,你先递增并在 temp != last 处终止,如果你有大小为 1 的列表会发生什么?您的第一个 == end 并且您执行 *first = *temp 还会将您的 cout 语句移到 *first = *temp 之前的一行,这样您将在输出中获得您想要的内容。

于 2014-12-17T19:10:38.523 回答
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;
}

再次为错误道歉。

于 2014-12-18T20:00:55.863 回答