复制算法与容器构造函数

时间:2014-01-26 21:21:57

标签: c++ c++11 stl copy stdvector

如果复制算法直接使用容器的构造函数有什么好处?

此示例来自cplusplus.com:

// copy algorithm example
#include <iostream>     // std::cout
#include <algorithm>    // std::copy
#include <vector>       // std::vector

int main () {
  int myints[]={10,20,30,40,50,60,70};
  std::vector<int> myvector (7);

  std::copy ( myints, myints+7, myvector.begin() );

  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it = myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;

  std::cout << '\n';

  return 0;
}

为什么复制方法应优先于

std::vector<int> myvector(myints, myints+7);

3 个答案:

答案 0 :(得分:4)

这是cplusplus.com上一个不好的例子。如果你有这样一个数组,并且真的要将它复制到一个向量中,你将使用构造函数。 std::copy在许多其他方面很有用(例如,如果你想将数组输出到文件或控制台),但构造不是其中之一。

答案 1 :(得分:2)

首先,因为你使用的是C ++ 11:

int myints[]={10,20,30,40,50,60,70};
std::vector<int> myvector(myints, myints+7);

for (std::vector<int>::iterator it = myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;

实际上可以用以下方式编写:

std::vector<int> myVector = {10,20,30,40,50,60,70};

for (const int i : myVector )
    std::cout << ' ' << i;
其次,你正在比较:
  • 使用迭代器与
  • 直接构造向量
  • 构建向量,其元素将使用std::copy覆盖。
如果要使用C样式的数组/迭代器构造向量,则:
std::vector<int> myVector(myints, myints+7);
如果要使用现有向量构建另一个向量,则执行以下操作之一:
std::vector<int> myVector2(myVector);
std::vector<int> myVector3 = myVector;  // invokes copy constructor anyway...
如果您已经有2个向量,并且想要用另一个向量覆盖,那么:
myVector2 = myVector;

...只是不要过早优化,让你的代码反映你的目的。

答案 2 :(得分:1)

它对于构建新容器没有用,因为大多数时候容器本身可以使用迭代器

如果您正在使用原始数组,则可能必须使用它。 E.g:

std::vector<int> my_vect;
int* array_for_a_low_level_lib = new int[my_vect.size()];
std::copy(std::begin(my_vect), std::end(my_vect), array_for_a_low_level_lib);

以下是我最喜欢的两个用法示例,添加iterator标题:

template <typename InnerType, typename Container>
void fill_container(Container& cont)
{
  std::copy(std::istream_iterator<InnerType>(std::cin), 
            std::istream_iterator<InnerType>(), 
            std::inserter(cont, cont.end()));
}

template <typename InnerType, typename Container>
void print_container(const Container& cont)
{
  std::copy(std::begin(cont), std::end(cont), 
    std::ostream_iterator<InnerType>(std::cout, " "));
}

http://ideone.com/4MOhSE

还可以与boost::range适配器一起使用,你可以做一些很棒的事情,比如用一个非常易读的行填充地图中的矢量。