我需要能够从向量中删除元素并决定查看擦除 - 删除习语,这是一种来自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;
}
答案 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()