我需要对列表进行循环排列,例如我有:(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;
}
如果你知道为什么不犹豫......
答案 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_permutation
和prev_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;
}
再次抱歉错误。