反转矢量,然后构建另一个矢量
Reverse vector, and build another vector
我想知道是否有一种方法可以反转一个向量并将其构建到另一个向量中?
#include "std_lib_facilities.h"
int main()
{
vector<int> oldvector;
oldvector[1];
oldvector[3];
oldvector[5];
oldvector[7];
oldvector[9];
}
这就是我目前所拥有的,任何帮助都将是伟大的。
如果你想创建一个新的矢量,那么你可以这样做:
std::vector<int> oldvector = {1,2,3,4,5};
std::vector<int> newvector(oldvector.rbegin(), oldvector.rend());
对于矢量的反演,您可以简单地使用
std::reverse(a.begin(), a.end());
然后将其用作新的矢量。
有几种方法可以完成这项任务。最简单的方法是使用带有参数的构造函数或成员函数assign
作为迭代器
例如
#include <vector>
#include <iostream>
int main()
{
std::vector<int> v1 = { 1, 3, 5, 7, 9 };
std::vector<int> v2( v1.rbegin(), v1.rend() );
for ( int x : v1 ) std::cout << x << ' ';
std::cout << std::endl;
for ( int x : v2 ) std::cout << x << ' ';
std::cout << std::endl;
}
或
#include <vector>
#include <iostream>
int main()
{
std::vector<int> v1 = { 1, 3, 5, 7, 9 };
std::vector<int> v2;
v2.assign( v1.rbegin(), v1.rend() );
for ( int x : v1 ) std::cout << x << ' ';
std::cout << std::endl;
for ( int x : v2 ) std::cout << x << ' ';
std::cout << std::endl;
}
另一种方法是使用标准算法CCD_ 2。例如
#include <vector>
#include <iostream>
#include <algorithm>
#include <iterator>
int main()
{
std::vector<int> v1 = { 1, 3, 5, 7, 9 };
std::vector<int> v2;
v2.reserve( v1.size() );
std::reverse_copy( v1.begin(), v1.end(), std::back_inserter( v2 ) );
for ( int x : v1 ) std::cout << x << ' ';
std::cout << std::endl;
for ( int x : v2 ) std::cout << x << ' ';
std::cout << std::endl;
}
或者你可以用普通的循环写同样的东西
#include <vector>
#include <iostream>
int main()
{
std::vector<int> v1 = { 1, 3, 5, 7, 9 };
std::vector<int> v2;
v2.reserve( v1.size() );
for ( std::vector<int>::size_type i = v1.size(); i != 0; )
{
--i;
v2.push_back( v1[i] );
}
for ( int x : v1 ) std::cout << x << ' ';
std::cout << std::endl;
for ( int x : v2 ) std::cout << x << ' ';
std::cout << std::endl;
}
或者甚至可以使用堆栈作为中间容器!:)
#include <iostream>
#include <vector>
#include <stack>
int main()
{
std::vector<int> v1 = { 1, 3, 5, 7, 9 };
std::stack<int> s;
for ( int x : v1 ) s.push( x );
std::vector<int> v2;
v2.reserve( v1.size() );
while ( !s.empty() )
{
v2.push_back( s.top() );
s.pop();
}
for ( int x : v1 ) std::cout << x << ' ';
std::cout << std::endl;
for ( int x : v2 ) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
那么递归函数呢?例如,它可以看起来像
#include <iostream>
#include <vector>
std::vector<int>::iterator reverse( std::vector<int>::const_iterator first,
std::vector<int>::const_iterator last,
std::vector<int>::iterator out )
{
if ( first != last )
{
int x = *first++;
out = ::reverse( first, last, out );
*out++ = x;
}
return out;
}
int main()
{
std::vector<int> v1 = { 1, 3, 5, 7, 9 };
std::vector<int> v2( v1.size() );
::reverse( v1.cbegin(), v1.cend(), v2.begin() );
for ( int x : v1 ) std::cout << x << ' ';
std::cout << std::endl;
for ( int x : v2 ) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
对不起!我忘了提到标准算法std::copy_backward
。它也可以应用
#include <iostream>
#include <vector>
#include <algorithm>
int main()
{
std::vector<int> v1 = { 1, 3, 5, 7, 9 };
std::vector<int> v2( v1.size() );
std::copy_backward( v1.begin(), v1.end(), v2.rend() );
for ( int x : v1 ) std::cout << x << ' ';
std::cout << std::endl;
for ( int x : v2 ) std::cout << x << ' ';
std::cout << std::endl;
return 0;
}
您可能希望使用std::reverse()
在适当的位置反转向量,或者反转std::vector::rbegin()
/rend()
返回的迭代器来构建原始向量的反转副本。
考虑以下可编译的示例代码(生活在Ideone.com上):
#include <algorithm> // For std::reverse
#include <iostream> // For console output
#include <vector> // For std::vector
using namespace std;
// Used to print elements of a sequence (like vector).
template <typename Sequence>
void print(const Sequence& s) {
cout << "[ ";
for (const auto& x : s) {
cout << x << ' ';
}
cout << "]" << endl;
}
int main() {
cout << "Original vector:n";
vector<int> v{10, 20, 30, 40, 50};
print(v);
vector<int> v2(v.rbegin(), v.rend());
cout << "nReversed copy using reverse iterators:n";
print(v2);
reverse(v.begin(), v.end());
cout << "nReversed in-place using std::reverse():n";
print(v);
}
输出:
Original vector: [ 10 20 30 40 50 ] Reversed copy using reverse iterators: [ 50 40 30 20 10 ] Reversed in-place using std::reverse(): [ 50 40 30 20 10 ]
相关文章:
- 删除一个线程上有数百万个字符串的大型哈希映射会影响另一个线程的性能
- 将vector<vector<double>>从x86平台中创建的一个进程发送到x64中构建的另一个进程的最快方法是什么
- cmake在构建过程中使用另一个工具检测标志
- 在C++(arduino)中,我如何使用一个字段来构建另一个字段
- 构建并使用使用另一个共享库的源文件中的共享库.(Rinside)
- 用Cmake构建在一个QTCreator版本中与另一个QTCreator版本一起使用,并与terminal的Catkin
- 使用StringStream从循环中的另一个字符串构建字符串
- Android Studio使用JNI来构建C/C ,但是C/C 需要另一个lib.a,如何解决
- 用C++为java构建一个dll,它正在调用另一个dll(Eclipse上的JNI)
- Xcode 拒绝构建我的一个 OpenCL 项目,但成功构建了另一个项目
- 在另一个系统上构建时禁用特定的C++行和 #includes
- 使用共享库的后果dlopen另一个具有不同构建类型的共享库
- 在linux中使用另一个共享库构建共享库
- 基于另一个向量构建的向量的成员的geting索引
- 用与另一个库相同的符号构建一个库
- 如何将Eclipse c++项目构建为库并将其添加到另一个项目中
- 反转矢量,然后构建另一个矢量
- 在另一个库(SDL和Eclipse)之上构建一个新库
- 在Unity项目中使用依赖于另一个NDK构建的库时出错
- 在另一个平台上构建