【发布时间】:2016-11-10 00:08:53
【问题描述】:
对于冗长的标题,我深表歉意,但我注意到一个奇怪的行为,无论我做了多少测试,我都无法理解。我希望有人能阐明这里发生的事情,以及这是否是由于我做错了什么。
我创建了一个自定义类“T”的向量“v”,我用独特的对象填充了它。我想将此向量用作一种参考表。
我创建了一个由“T”指针组成的向量“vp”,它的每个元素都指向“v”中的一个特定的唯一元素。然后我打乱了“vp”并为其创建了一个迭代器“i”,这意味着我可以遍历“vp”并以随机顺序获得唯一的“T”,而无需修改“v”。
然后我创建了一个类型对的向量,目的是用随机的“T”填充它。但是我发现,每次将一个新元素添加到这个对向量中时,T& 的值都会更新为“i”的当前值。这是什么原因,(假设我必须使用这种方法)有什么办法可以避免它?我试图描述的简化代码如下:
std::vector<T> v{ ... }; //Contains list of unique 'T's
std::vector<T*> vp{};
for (std::vector<T>::const_iterator iElement = v.begin(); iElement < v.end(); ++iElement)
vp.push_back(&(*iElement));
//Code for swapping elements of vp goes here
std::vector<std::pair<T&, int>> classVector{};
std::vector<T*>::iterator i{ vp.begin() };
for (int n = 0; n < 5; ++n)
{
classVector.push_back(std::make_pair(**i, 1));
++i;
}
感谢您的帮助。
编辑:错误地使用了 for each 循环来迭代 v,改为迭代器。
【问题讨论】:
-
那是标题的开膛手;-)
-
for (T t : v)正在制作v中对象的临时副本,指向这些对象的指针将立即失效。 -
谢谢你是对的。我在写的时候遇到了这个问题,解决后很快就忘记了,所以当我开始编写示例代码时,我试图简化它。我将对其进行编辑并记下。
-
最好编译您发布的示例代码,以确保它显示的错误与您的真实代码相同。
-
好建议,我以后会这样做的。
标签: c++ pointers vector reference