用智能指针擦除 - 删除成语

时间:2016-10-10 18:59:06

标签: c++ pointers vector dereference

我需要能够从向量中删除元素并决定查看擦除 - 删除习语,这是一种来自C ++标准库的算法,而不是手写循环。我还想使用智能指针向量,而不是原始指针。

我发现了许多关于擦除 - 移除习语的帖子,其中很多人都建议使用智能指针。根据这个建议,我写了3个可行的擦除 - 删除习语的例子,我在下面复制,后面是输出:没有指针,原始指针和智能指针。注意智能指针所需的三重引用。

我的问题:这是一个很好的实现删除智能指针的删除习惯用法还是有一些......更聪明的方法?谢谢你的关怀。

  

int的向量:1 1 3
  int的向量:3
  int的指针向量:1 1 3
  int的指针向量:1 3
  矢量智能指针的int:1 1 3
  int的智能指针向量:1 3

#include <windows.h>
#include <algorithm>
#include <iostream>
#include <vector>
#include <memory>
#include <string>

std::vector<int> intVector;
std::vector<int*> intVectorPointers;
std::vector<std::shared_ptr<int*>> intVectorSmartPointers;

void printVector(std::vector<int> intV){
    std::cout << "vector of int: ";
    for (std::vector<int>::const_iterator it = intV.begin(); it != intV.end(); it++)
    std::cout << ' ' << *it;
    std::cout << '\n';
}

void printVectorPointers(std::vector<int*> intVPointers){
    std::cout << "vector of pointers of int: ";
    for (std::vector<int*>::const_iterator it = intVPointers.begin(); it != intVPointers.end(); it++)
    std::cout << ' ' << **it;
    std::cout << '\n';
}

void printVectorSmartPointers(std::vector<std::shared_ptr<int*>> intVSmartPointers) {
    std::cout << "vector of smart pointers of int: ";
    for (std::vector<std::shared_ptr<int*>>::const_iterator it = intVSmartPointers.begin(); it != intVSmartPointers.end(); it++)
    std::cout << ' ' << ***it;
    std::cout << '\n';
}


int main(int argc, char* argv[]) {

    int int1 = 1;
    int int2 = 1;
    int int3 = 3;

    int *intPointer1 = &int1;
    int *intPointer2 = &int2;
    int *intPointer3 = &int3;

    std::shared_ptr<int*> intSmartPointer1 = std::make_shared<int*>(intPointer1);
    std::shared_ptr<int*> intSmartPointer2 = std::make_shared<int*>(intPointer2);
    std::shared_ptr<int*> intSmartPointer3 = std::make_shared<int*>(intPointer3);

    intVector.push_back(int1);
    intVector.push_back(int2);
    intVector.push_back(int3);

    intVectorPointers.push_back(intPointer1);
    intVectorPointers.push_back(intPointer2);
    intVectorPointers.push_back(intPointer3);

    intVectorSmartPointers.push_back(intSmartPointer1);
    intVectorSmartPointers.push_back(intSmartPointer2);
    intVectorSmartPointers.push_back(intSmartPointer3);

    printVector(intVector);
    intVector.erase(std::remove(intVector.begin(), intVector.end(), int1), intVector.end());
    printVector(intVector);

    printVectorPointers(intVectorPointers);
    intVectorPointers.erase(std::remove(intVectorPointers.begin(), intVectorPointers.end(), intPointer1), intVectorPointers.end());
    printVectorPointers(intVectorPointers);

    printVectorSmartPointers(intVectorSmartPointers);
    intVectorSmartPointers.erase(std::remove(intVectorSmartPointers.begin(), intVectorSmartPointers.end(), intSmartPointer1), intVectorSmartPointers.end());
    printVectorSmartPointers(intVectorSmartPointers);;

    Sleep(50000);

    return 0;
}

2 个答案:

答案 0 :(得分:1)

正如其他人所指出的,除了删除本身之外,代码还存在问题。

但是,std::remove_if()失败的原因是因为你搜索intPointer1并只删除一个指针,而不是指向数字1的指针。

您没有说您是否有机会访问C ++ 11或更高版本。你可以写一个lambda来做到这一点:

intVectorPointers.erase(
    std::remove_if(
        intVectorPointers.begin(),
        intVectorPointers.end(),
        [](auto const & p) { return *p == 1; }),
    intVectorPointers.end());

我还没有使用您的整个代码进行测试,但类似的东西应该可行。 (这假设您修复了指针并且* p实际指向数据而不是示例中的另一个指针,我很确定这不是您想要的。)

答案 1 :(得分:-1)

所以它可以帮助其他人,这里有一个清理版本的擦除 - 删除成语与智能指针。关于你的评论,没有更多指针,唯一指针而不是共享指针和predicted = net.blobs['prob'].data 而不是remove_if()

remove()