我有2个这样的矢量:
std::vector <svm_node *> vettProbX;
std::vector <double> vettProbY;
svm_node
是一个结构。
我需要从这些向量中仅获取每个50的元素。例如,如果vettProbY
的维度为1000,我将只获得20个值(0,50,100,150,200 ..)。
我怎样才能为它们实现这个算法?
我认为对于vettProbY
我可以实现这样的事情:
std:: vector <double> NewVettProbY
for(int i=0; i<vettProbY.size(); i++)
{
if((i % 50)=0)
NewVettProbY.push_back(vettProbY[i]);
}
但我不知道如何为向量vettProbX
实现相同的东西。
感谢您的帮助。
答案 0 :(得分:1)
首先要注意的是,您要在vettProbX
内存储原始指针:
std::vector<svm_node *> vettProbX;
你确定吗?如果它们是观察指针,那么STL容器内的原始指针就可以了。但拥有原始指针是不好的,也是漏洞的来源!
另一个选项可以是使用带有 smart 指针的STL容器,例如shared_ptr
,例如:
std::vector<std::shared_ptr<svm_node>> vettProbX;
(对于唯一所有权,std::unique_ptr
很好,比shared_ptr
更高效,更轻量级。)
无论如何,你可能想要使用这样的代码:
std::vector<double> newVettProbY;
for (size_t i = 0; i < vettProbY.size(); i += 50 /* step */)
{
newVettProbY.push_back(vettProbY[i]);
}
// Assuming:
// std::vector<std::shared_ptr<svm_node>> vettProbX;
std::vector<std::shared_ptr<svm_node>> newVettProbX;
for (size_t i = 0; i < vettProbX.size(); i += 50 /* step */)
{
newVettProbX.push_back(vettProbX[i]);
}
答案 1 :(得分:0)
假设您需要复制,而不是参考共享。你可以这样做:
std::vector <double> newVettProbY;
std::vector <svm_node *> newVettProbX;
svm_node * newNode;
for(int i=0; i<vettProbY.size(); i+=50)
{
NewVettProbY.push_back(vettProbY[i]);
newNode = new svm_node;
memcpy(newNode, vettProbX[i], sizeof(svm_node));
newVettProbX(newNode);
}
这里我假设两个矢量具有相同的大小。另请注意,我已经改善了你的周期。
答案 2 :(得分:0)
您可以使用模板功能执行此操作。因此,您可以将它用于所有类型。
template<typename T>
std::vector<T> get_50th(std::vector<T> const& l) {
std::vector<T> r;
for(size_t it=0; it<l.size(); it+=50)
r.push_back(l.at(it));
return r;
}