OutputIterator从std :: copy返回

时间:2015-06-07 19:58:04

标签: c++ c++11

函数模板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>的第三个参数相同的类型?

更正将予以表彰。

3 个答案:

答案 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