STL克隆向量

5

你好! 我在尝试将指向Point的指针向量复制到Point时遇到了困难。

vector<Point*> oldVector

我希望将这个向量复制到另一个向量中。因此,我使用了一个复制构造函数。我是这样做的:

vector<Point*> newVector = vector<Point*>(oldVector.begin(),oldVector.end());

很不幸,如果我运行这个函数,就会出现异常/错误。

向量迭代器不兼容

可能是什么问题呢?

编辑 迭代器可能存在更大的问题,似乎我根本不能使用迭代器。我想将两个STL向量相加,所以我写了这样的代码。

 vector<int> a, b;
    b.insert(b.end(), a.begin(), a.end());

在执行这行代码时,我遇到了相同的异常/错误。

enter image description here


3
那实际上不是你的错误信息。我可以看出来,因为里面有一个打字错误。请提供完整的错误信息,以帮助未来遇到同样问题的人。 - Merlyn Morgan-Graham
5个回答

18

那将是两者之一

vector<Point*> *newVector = new vector<Point*>(oldVector.begin(),oldVector.end());
或者
vector<Point*> newVector(oldVector.begin(),oldVector.end());

在创建对象时,只有在从堆中分配空间时才使用赋值语句。否则,您只需将构造函数参数放在新变量名称后面的括号内即可。

或者,以下方法更加简单:

vector<Point*> newVector(oldVector);

@Berial:虽然使用复制构造函数肯定比使用迭代器版本更好,但迭代器版本也应该可以正常工作。如果不能正常工作,那么肯定存在其他问题。 - Benjamin Lindley
@PigBen:我倾向于相信使用迭代器版本不是问题的两个原因:首先,正如@Merlyn在上面的评论中指出的那样,“不兼容的迭代器”消息不太可能是实际的错误消息。其次,复制构造函数通常是基于std::copy(oldVector.begin( ). oldVector.end( ))实现的,因此如果这些与迭代器版本不兼容,则我预计复制构造函数也会失败。 - Mac
“much simpler”这个版本运行得非常完美,但是它更难读懂:/ - SAFAD

1
vector<Point*> newVector = vector<Point*>(oldVector.begin(),oldVector.end());

为什么是这个?

为什么不是这个:

vector<Point*> newVector(oldVector.begin(),oldVector.end());

编程越晚越好!

更好的是这个:

vector<Point*> newVector(oldVector);

2
我没有想到这会有所不同。 - Berial

1

因为原始容器是相同类型的,std::vector<Point*>,所以不需要使用范围构造函数;只需使用复制构造函数即可!

std::vector<Point*> newVector(oldVector);

但这不是主要问题。主要问题在于共享指针。要非常清楚地知道谁拥有指向的数据。小心双重删除!


0

你想要什么

Vector<Point*> newVector(oldVector.begin(), oldVector.end());

0

那应该可以工作(刚用 std::vector<int> 测试了一下)。一定还有其他问题。 Point 有复制构造函数吗?


Point 的复制构造函数是无关紧要的 - 这是一个 Point* 指针数组,而不是 Point 对象。 - Mac
我认为我不必为Point类编写自己的复制构造函数,因为该类仅由平凡类型(非引用类型)组成。 - Berial
@Mac:没错,我也是这么想的,因为我的GCC 4.5.2版本在给定的语法方面没有报错... - rubenvb

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接