Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/144.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ std::在两个DEQUE上移动-输入与输出迭代器_C++_C++11_Iterator_Std_Move - Fatal编程技术网

C++ std::在两个DEQUE上移动-输入与输出迭代器

C++ std::在两个DEQUE上移动-输入与输出迭代器,c++,c++11,iterator,std,move,C++,C++11,Iterator,Std,Move,请看下面的代码: #include <algorithm> #include <deque> #include <iostream> using namespace std; int main() { deque<int> in {1,2,3}; deque<int> out; // line in question move(in.begin(), in.end(), out.begin()); for(aut

请看下面的代码:

#include <algorithm>
#include <deque>
#include <iostream>

using namespace std;

int main()
{
  deque<int> in {1,2,3};
  deque<int> out;
  // line in question
  move(in.begin(), in.end(), out.begin());
  for(auto i : out)
    cout << i << endl;

  return 0;
}
这在某种程度上是有意义的,因为std::move期望它的前两个参数是这里满足的InputIterator,而第三个参数是OutputIterator,out.begin不满足


如果执行原始代码并将move传递给不是输出迭代器的迭代器,实际会发生什么?为什么C++的类型安全性在这里不起作用?为什么将输出迭代器的构造委托给外部函数,即为什么out.backInserter不存在?

原始代码尝试取消引用并递增out.begin。因为out是空的,所以它是一个超过末端迭代器的值,不能取消引用或递增。这样做会产生未定义的行为

std::move期望第三个[…]是outputierator,而out.begin不是

是的。具体来说,它是一个可变随机访问迭代器,支持输出迭代器所需的所有操作,等等

如果执行原始代码并将move传递给不是输出迭代器的迭代器,实际会发生什么

如果迭代器不支持函数所需的输出迭代器的操作,则会导致编译错误;或未定义的行为,如果操作存在,但执行的不是输出迭代器所需的操作

为什么C++的类型安全性在这里不起作用

因为类型是正确的。错误的运行时状态是一个结束迭代器,而不是一个序列的开始,该序列的元素数至少与输入范围的元素数相同,无法通过静态类型系统检测到

为什么out.backInserter不存在


这必须为所有序列容器分别编写:标准容器和您自己定义的任何其他容器。泛型函数只需在标准库中实现一次,即可用于任何支持push_-back的容器。

原始代码尝试取消引用并递增out.begin。因为out是空的,所以它是一个超过末端迭代器的值,不能取消引用或递增。这样做会产生未定义的行为

std::move期望第三个[…]是outputierator,而out.begin不是

是的。具体来说,它是一个可变随机访问迭代器,支持输出迭代器所需的所有操作,等等

如果执行原始代码并将move传递给不是输出迭代器的迭代器,实际会发生什么

如果迭代器不支持函数所需的输出迭代器的操作,则会导致编译错误;或未定义的行为,如果操作存在,但执行的不是输出迭代器所需的操作

为什么C++的类型安全性在这里不起作用

因为类型是正确的。错误的运行时状态是一个结束迭代器,而不是一个序列的开始,该序列的元素数至少与输入范围的元素数相同,无法通过静态类型系统检测到

为什么out.backInserter不存在

这必须为所有序列容器分别编写:标准容器和您自己定义的任何其他容器。通用函数只需在标准库中实现一次,即可用于任何支持push_back的容器。

out.begin是一个非常好的输出计算器,如果您先执行out.resize。这不会移动任何东西。这是一种未定义的行为,试图写入超出out容器末尾的内容,因此它可以执行任何操作,包括将元素移动到内存中的某个随机位置,或崩溃,或使计算机起火。out.begin是一个非常好的输出迭代器,如果您先执行out.resize。这不会移动任何内容。这是一种未定义的行为,试图写入超出容器末尾的内容,因此它可以执行任何操作,包括将元素移动到内存中的某个随机位置,或崩溃,或使计算机起火。
move(in.begin(), in.end(), std::back_inserter(out));