C++11STL中常用移动算法有哪些,请详细介绍
时间: 2023-12-10 15:04:13 浏览: 94
C++11STL中常用的移动算法主要包括以下几种:
1. `std::move`:将一个范围内的元素移动到另一个范围内。
2. `std::move_backward`:将一个范围内的元素移动到另一个范围内,保持元素顺序不变。
3. `std::forward`:将一个左值引用转换为右值引用,用于完美转发。
这些算法都可以用于移动元素。移动元素可以提高程序的效率,因为它避免了不必要的复制操作。下面是这些算法的详细介绍:
1. `std::move`:将一个范围内的元素移动到另一个范围内。它的声明如下:
```c++
template< class InputIt, class OutputIt >
OutputIt move( InputIt first, InputIt last, OutputIt d_first );
```
其中,`first`和`last`表示输入范围的起始和结束迭代器,`d_first`表示输出范围的起始迭代器。该函数会将`[first, last)`范围内的元素移动到`[d_first, d_first + (last - first))`范围内,返回输出范围的结束迭代器。
示例:
```c++
vector<string> v1{"hello", "world"};
vector<string> v2(2);
std::move(v1.begin(), v1.end(), v2.begin());
// v1: {"", ""}, v2: {"hello", "world"}
```
2. `std::move_backward`:将一个范围内的元素移动到另一个范围内,保持元素顺序不变。它的声明如下:
```c++
template< class BidirIt1, class BidirIt2 >
BidirIt2 move_backward( BidirIt1 first, BidirIt1 last, BidirIt2 d_last );
```
其中,`first`和`last`表示输入范围的起始和结束迭代器,`d_last`表示输出范围的结束迭代器。该函数会将`[first, last)`范围内的元素移动到`[d_last - (last - first), d_last)`范围内,返回输出范围的起始迭代器。
示例:
```c++
vector<string> v1{"hello", "world"};
vector<string> v2(2);
std::move_backward(v1.begin(), v1.end(), v2.end());
// v1: {"", ""}, v2: {"hello", "world"}
```
3. `std::forward`:将一个左值引用转换为右值引用,用于完美转发。它的声明如下:
```c++
template< class T >
constexpr T&& forward( typename std::remove_reference<T>::type& t ) noexcept;
template< class T >
constexpr T&& forward( typename std::remove_reference<T>::type&& t ) noexcept;
```
`std::forward`的作用是将传入的引用转发到另一个函数中。它可以保留被转发对象的左值或右值属性,避免不必要的拷贝或移动操作。
示例:
```c++
template<typename T, typename... Args>
shared_ptr<T> make_shared(Args&&... args) {
return std::shared_ptr<T>(new T(std::forward<Args>(args)...));
}
```
在这个示例中,`std::forward`用于将`args`中的参数完美转发到`T`类的构造函数中,避免了不必要的拷贝或移动操作。
阅读全文