std::vector::push_back 的问题
Problems with std::vector::push_back
我在 C++ 中遇到 std::vector::push_back 的一些意外行为。我有以下伪代码,我希望它足够清楚以证明我所看到的问题:
MyClass* myClass = new MyClass();
std::vector<MyObject*> newObjects;
myClass->VectorOperation(oldObject, newObjects);
MyClass::VectorOperation(MyObject* oldObject, std::vector<MyObject*> newObjects)
的操作应该如下:
void MyClass::VectorOperation(MyObject* oldObject, std::vector<MyObject*> newObjects)
{
if (// Some condition on oldObject)
{
newObjects->push_back(oldObject);
}
else
{
// Operations that can result in translating a single oldObject into many MyObjects, e.g.
MyObject* newObject1 = new MyObject();
MyObject* newObject2 = new MyObject();
newObjects->push_back(newObject1);
newObjects->push_back(newObject2);
}
}
我看到的问题是,在 VectorOperation
中的 if
语句成功执行后,newObjects
向量为空,即 newObjects
向量应该有一个对应于 oldObject
的条目。我对 C++ 比较陌生,但我不确定我在这里遗漏了什么。非常感谢任何帮助。
谢谢!
编辑:
我输错了方法签名。应该是:
void MyClass::VectorOperation(MyObject* oldObject, std::vector<MyObject*>* newObjects)
添加&
:
void MyClass::VectorOperation(MyObject* oldObject, std::vector<MyObject*>& newObjects) {
// ^
if (// Some condition on oldObject)
{
newObjects.push_back(oldObject);
// ^ Guess you meant . instead of ->.
}
...
}
现在,当您传递 newObjects
矢量时,您会复制它,因此 push_back
恰好是复制的矢量,而不是原始矢量。如果您添加 &
,您将通过引用传递 newObjects
,因此向量不会被复制并且 oldObject
将被推回原始向量。
我在 C++ 中遇到 std::vector::push_back 的一些意外行为。我有以下伪代码,我希望它足够清楚以证明我所看到的问题:
MyClass* myClass = new MyClass();
std::vector<MyObject*> newObjects;
myClass->VectorOperation(oldObject, newObjects);
MyClass::VectorOperation(MyObject* oldObject, std::vector<MyObject*> newObjects)
的操作应该如下:
void MyClass::VectorOperation(MyObject* oldObject, std::vector<MyObject*> newObjects)
{
if (// Some condition on oldObject)
{
newObjects->push_back(oldObject);
}
else
{
// Operations that can result in translating a single oldObject into many MyObjects, e.g.
MyObject* newObject1 = new MyObject();
MyObject* newObject2 = new MyObject();
newObjects->push_back(newObject1);
newObjects->push_back(newObject2);
}
}
我看到的问题是,在 VectorOperation
中的 if
语句成功执行后,newObjects
向量为空,即 newObjects
向量应该有一个对应于 oldObject
的条目。我对 C++ 比较陌生,但我不确定我在这里遗漏了什么。非常感谢任何帮助。
谢谢!
编辑: 我输错了方法签名。应该是:
void MyClass::VectorOperation(MyObject* oldObject, std::vector<MyObject*>* newObjects)
添加&
:
void MyClass::VectorOperation(MyObject* oldObject, std::vector<MyObject*>& newObjects) {
// ^
if (// Some condition on oldObject)
{
newObjects.push_back(oldObject);
// ^ Guess you meant . instead of ->.
}
...
}
现在,当您传递 newObjects
矢量时,您会复制它,因此 push_back
恰好是复制的矢量,而不是原始矢量。如果您添加 &
,您将通过引用传递 newObjects
,因此向量不会被复制并且 oldObject
将被推回原始向量。