3

我正在阅读 Accelerated C++,对于下面发布的问题,我需要一些建议。

  1. 这段代码有什么作用?

    vector<int>u(10,100)    
    vector<int>v;    
    copy(u.begin(), u.end(), v.end());
    
  2. 提供 2 种可能的方法来纠正程序,并列出其优缺点。

第一部分非常简单,但我在第二部分需要帮助。我提供了 3 种方法,我想知道是否还有其他可能的解决方案。

另外,我不确定我的方法的优缺点。我做了一个尝试,所以请给我你的意见。


copy()

std::vector<int> u(10, 100);
std::vector<int> v;
std::vector<int> w ;
std::vector<int> x ;
std::copy(u.begin(), u.end(), back_inserter(v)); // 1st way of doing

好处

  • std::copy()不会改变迭代器的值
  • 由于 的参数std::copy()不依赖于具体的容器,所以代码可以和不同的容器复用

缺点

  • std::back_inserter()仅适用于顺序容器,因此不能与地图一起使用
  • 将错误的迭代器值分配给第三个参数std::copy()不会导致编译器错误,但程序的行为可能会有所不同

insert()

w.insert(w.end(), u.begin(), u.end() );

好处

  • insert()可与大多数容器一起使用

缺点

一个都想不出来


push_back()

for ( std::vector<int>::const_iterator it = w.begin(); it != w.end(); ++it )
{
    x.push_back( *it );
}

好处

一个都想不出来

缺点

  • 慢于std::copy()vector::insert()

我的方法正确吗?还有哪些其他可能的解决方案?

4

2 回答 2

5

您的标题表明您对复制向量感兴趣,但您的代码表明您对插入向量感兴趣(请记住,尽管它的名称std::copy在这里用于插入)。

如果要复制:

// This requires the vector types to match exactly
std::vector<int> v = u;

// In case the vector differ in their value_type
// This requires that the value_type of the source be
// convertible to the value_type of the destination
std::vector<int> v(u.begin(), u.end());

如果要插入,那么您描述的两种方法(使用std::copy加上迭代器适配器或调用insert成员)都是合适的。您应该根据您是在特定代码位置使用容器还是使用迭代器来选择一个。(使用迭代器时,使用迭代器适配器的负担由传递迭代器的客户端承担,因此无需担心push_back。)如果您只有迭代器,那么调用 eginsert根本不是一种选择。如果您确实有容器并且其中一名成员可以完成这项工作,那么请随意使用它。不过,我不会认为使用算法是错误的。

尝试将显式循环作为最后的选择。

于 2012-08-31T16:51:15.593 回答
0

It seems to me, the authors mean std::copy() still should be used. So the first solution would be (as you suggested):

std::copy(u.begin(), u.end(), back_inserter(v));

Another one could be:

v.resize(u.size());
std::copy( u.begin(), u.end(), v.begin() );
于 2013-12-22T01:19:53.930 回答