c++ - 指针 vector 和删除特定值

标签 c++ c++11 pointers vector

我在寻找从指针 vector 中删除值的方法时遇到了一些麻烦。

我有一个 vector std::vect<MyClass*> myVect其中包含指向对象的指针 o1, o2,...按特定顺序。我很难找到如何删除一个特定对象的条目,例如 o1

我试过了

void remove(MyClass C)
{
    myVect.erase( std::find_if( myVect.begin(), myVect.end(), [&](MyClass* W) 
   {return &C == W;} ) );
} 

但我的 bool lambda 从未返回 true(已使用断言验证)。我做错了什么吗? (我必须说我对 Lambda 函数/tor 不是很熟悉)

非常感谢!

最佳答案

您的函数接受 MyClass 作为 C 的值,因此它始终在函数的本地范围内使用新创建的实例。

您的测试函数正在检查 &C == W;,但是 C 的地址不可能匹配存储在 vector 中的地址>(除非 删除 之前添加了它)。

如果您真的希望通过地址进行测试,您可能希望通过引用接受您的论点,void remove(MyClass& C) 在这种情况下,您的代码的某些其他部分可以通过现有的通过引用的对象,其指针可能在 vector 中。

更有可能的是,您希望按值进行测试,在这种情况下,为了提高效率,您可能希望代码更像这样:

void remove(const MyClass& C)  // Receive by const reference to avoid pointless copy
{
    // Testing C == *W tests the value pointed to, not the pointers themselves
    myVect.erase( std::find_if( myVect.begin(), myVect.end(), [&](MyClass* W) 
   {return C == *W;} ) );
 } 

关于c++ - 指针 vector 和删除特定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/51717746/

相关文章:

pointers - 在 Golang 中使用指针的问题

c++ - 需要 Union hack

c++ - Visual Studio 等同于 c++11(或更低版本)中的 gcc __attribute__((unused))?

c++ - 比较 std::addressof() 与十六进制数

c++ - 从枚举值中获取正确的模板化类实例化

c - 在 C 中将一维数组重新转换/转换为二维数组

c++ - 解释c中的头文件路径

C++函数作为参数错误

c++ - 如何避免在 C++ 中使用静态构造函数?

c++ - 删除指针导致堆损坏