函数模板std :: copy的等价物是:
template<class InputIterator, class OutputIterator>
OutputIterator copy (InputIterator first, InputIterator last, OutputIterator result)
{
while (first!=last) {
*result = *first;
++result; ++first;
}
return result;
}
此代码使用的是:
int * n = new int[3]{1,2,3};
int * m = new int[3]{4,5,6};
std::vector<int> asd;
std::copy(n,n+1,std::insert_iterator<std::vector<int>>(asd,asd.begin()));
根据我的理解:
我注意到的一件事是模板中的OutputIterator
返回类型,该类型基于副本的第3个参数。在这种情况下,std::insert_iterator
将返回std::vector<int>
,这也将是std::copy
我的问题
OutputIterator
何时收到?
该代码已被启动:
std::copy(n,n+1,std::insert_iterator<std::vector<int>>(asd,asd.begin()))
所以当函数结束时,是不是应该返回与std::vector<int>
的第三个参数相同的类型?
更正将予以表彰。
答案 0 :(得分:2)
返回的迭代器指的是刚刚复制的目标范围的末尾。在后插入迭代器的情况下,它也将是一个back_insert_iterator,因此写入它将在目标集合的末尾添加一个元素。
例如,代码如下:
#include <iostream>
#include <iterator>
#include <algorithm>
#include <vector>
int main() {
std::vector<int> s{ 1, 2, 3 };
std::vector<int> d;
auto i = std::back_inserter(d);
i = std::copy(s.begin(), s.end(), i);
*i = 5;
std::copy(d.begin(), d.end(), std::ostream_iterator<int>(std::cout, "\t"));
}
应该产生一个输出:
1 2 3 5
标准类型的官方措辞假设类似于随机访问迭代器(§25.3.1/ 2):
返回:结果+(最后 - 第一个)
...其中result
是作为目标传递的迭代器,first
是源范围的开头,last
是源范围的结尾。
答案 1 :(得分:1)
你对这个假设错了:
&#34;作为第三个参数
<%= link_to "Accept", user_accept_path(current_user) %>
&#34;
实际上std::vector<int>
。
答案 2 :(得分:1)
这个
std::insert_iterator<std::vector<int>>(asd,asd.begin())
是对迭代器适配器std::insert_iterator
的contsructor的调用。所以它将从算法std :: copy。
例如,请考虑以下代码段
int * n = new int[3]{1,2,3};
int * m = new int[3]{4,5,6};
std::vector<int> asd;
std::copy( m, m + 3,
std::copy( n, n + 3,
std::insert_iterator<std::vector<int>>( asd, asd.begin() ) ) );
首先,第一个动态分配的数组的所有元素都将插入到向量中,然后向量中的插入将继续使用第二个动态分配的数组的元素。
同样可以通过以下方式完成
std::vector<int> asd( n, n + 3 );
asd.insert( asd.end(), m, m + 3 );
这是一个演示程序,显示了两个代码片段
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
int main()
{
{
int * n = new int[3]{1,2,3};
int * m = new int[3]{4,5,6};
std::vector<int> asd;
std::copy( m, m + 3,
std::copy( n, n + 3,
std::insert_iterator<std::vector<int>>( asd, asd.begin() ) ) );
for ( int x : asd ) std::cout << x << ' ';
std::cout << std::endl;
delete []n;
delete []m;
}
{
int * n = new int[3]{1,2,3};
int * m = new int[3]{4,5,6};
std::vector<int> asd( n, n + 3 );
asd.insert( asd.end(), m, m + 3 );
for ( int x : asd ) std::cout << x << ' ';
std::cout << std::endl;
delete []n;
delete []m;
}
}
程序输出
1 2 3 4 5 6
1 2 3 4 5 6