说我有以下情况:
std::vector<std::vector<double>> v(6, std::vector<double>(6, 0.0));
std::vector<std::vector<double>> y;
for (const std::vector<double> &p : v) {
y.push_back(p);
}
这会将v
的深层副本复制到y
。有没有办法在std::copy
向量上使用2D
执行此操作。
std::copy(v.begin(), v.end(), y.begin())
不起作用。对于奖励积分,这可以扩展到ND
矢量案例吗?这对于避免以下N
深的循环似乎很重要:
...
for (const std::vector<std::vector<<double>> &p : v) {
for (const std::vector<double> &q : p) {
...
我知道性能明智没有区别,因为这是std::copy
的实现方式。只是想知道代码紧凑性。
答案 0 :(得分:9)
将STL容器复制到另一个容器的好习惯是:copy construct
。代码应该更快,异常安全。
例如:
auto y(v);
如果已创建y
,请使用vector::insert
y.insert(y.end(), v.begin(), v.end());
或
y = v;
答案 1 :(得分:2)
如果y
没有预分配内存,则std::begin(y)
的简单副本将导致未定义的行为。对于2D矢量,您可以将std::copy
与back_inserter
<iterator>
一起使用,例如
std::copy(v.begin(), v.end(), back_inserter(y));