【发布时间】:2012-08-31 16:25:16
【问题描述】:
我正在阅读 Accelerated C++,对于下面发布的问题,我需要一些建议。
-
这段代码有什么作用?
vector<int>u(10,100) vector<int>v; copy(u.begin(), u.end(), v.end()); 提供 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()慢。
我的方法正确吗?还有哪些其他可能的解决方案?
【问题讨论】:
-
在所有情况下,您都忘记了
dest.reserve(src.size());:) 尽管dest.insert(...)很可能会在内部通过src_end - src_begin执行此操作,但最好提前执行,因为它不能保证(而且您反正手头有大小)。 -
@xeo,感谢您提供此信息。您如何看待我所遵循的方法的好坏?
-
@Xeo -- 除非使用专门的自定义分配器或重复分析的数据表明如此,否则我很少看到需要使用
reserve或capacity。 -
std::vector::assign,使用普通迭代器调整大小和复制 -
v=u有什么问题?