要反转整个fun fibonacci(): Sequence<Int> {
// fibonacci terms
// 0, 1, 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, 144, 233, 377, 610, 987, 1597, 2584, 4181, 6765, 10946, ...
return generateSequence(Pair(0, 1), { Pair(it.second, it.first + it.second) }).map { it.first }
}
println(fibonacci().take(10).toList()) // [0, 1, 1, 2, 3, 5, 8, 13, 21, 34]
,存在vector
。但是我想将一个矢量分成两部分(恰好在中间)并反转两者,将它们重新组合在一起并再次反转整个std::reverse
。例如,我们有:
vector
将两部分分开并反转两部分:
0 1 2 3 4 5 6 7
- &gt; 0 1 2 3
和3 2 1 0
- &gt; 4 5 6 7
,将反转的部分放在一起7 6 5 4
然后再反转:3 2 1 0 7 6 5 4
。
我尝试使用4 5 6 7 0 1 2 3
,但这没有成功。这是我的代码片段:
reverse_copy
我如何实施我的方法?谢谢!
答案 0 :(得分:2)
std::reverse(nr.begin(), nr.begin() + nr.size() / 2 );
std::reverse(nr.begin() + nr.size() / 2 + ((nr.size() % 2) != 0 ? 1 : 0), nr.end());
std::reverse(nr.begin(), nr.end());
for (auto& it : nr)
{
std::cout << it << " ";
}
0, 1, 2, 3, 4, 5, 6, 7, 8
5 6 7 8 4 0 1 2 3
0, 1, 2, 3, 4, 5, 6, 7
4 5 6 7 0 1 2 3
答案 1 :(得分:1)
可以使用标准算法std::swap_ranges
完成任务。
例如
#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7 };
std::swap_ranges(v.begin(), std::next(v.begin(), v.size() / 2),
std::prev(v.end(), v.size() / 2));
for (int x : v) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
程序输出
4 5 6 7 0 1 2 3
否则,您只能使用std::reverse
代替算法std::reverse_copy
。
例如
#include <iostream>
#include <iterator>
#include <algorithm>
int main()
{
std::vector<int> v = { 0, 1, 2, 3, 4, 5, 6, 7 };
for (int x : v) std::cout << x << ' ';
std::cout << std::endl;
std::reverse(v.begin(), std::next(v.begin(), v.size() / 2));
std::reverse(std::prev(v.end(), v.size() / 2), v.end());
for (int x : v) std::cout << x << ' ';
std::cout << std::endl;
std::reverse(v.begin(), v.end());
for (int x : v) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
程序输出
0 1 2 3 4 5 6 7
3 2 1 0 7 6 5 4
4 5 6 7 0 1 2 3
答案 2 :(得分:0)
此版本将处理奇数个元素(让中间元素无动于衷)
auto size = nr.size();
auto begin = nr.begin();
auto end = nr.end();
std::reverse(begin, begin + size/2);
std::reverse(begin + size/2 + (size%2), end);
std::reverse(begin, end);
答案 3 :(得分:0)
如BoBTFish所述,这就是std :: rotate的作用。
#include <vector>
#include <iostream>
#include <algorithm>
void printVector(const std::vector<int>& aVector)
{
for (auto& val : aVector)
{
std::cout << val << " ";
}
std::cout << std::endl;
}
int main()
{
std::vector<int> intVect{0, 1,2,3,4,5,6,7};
printVector(intVect);
std::rotate(intVect.begin(), intVect.begin() + intVect.size() / 2, intVect.end());
printVector(intVect);
return 0;
}
这将输出所需的结果:
0 1 2 3 4 5 6 7
4 5 6 7 0 1 2 3