2014-02-26 29 views
0

花一些值i有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

感谢您的任何帮助。

+8

为什么你不能以完全相同的方式做到这一点? (虽然你的方法看起来效率不高,但为什么不每次都放50分)? – jcoder

+0

可以把svm_node和double放在一起吗?像这样:struct Foo {svm_node * nd_;双d_; }; std :: vector < Foo > vettProb; –

回答

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); 
} 

在这里,我认为这两个向量是相同大小的。另外请注意,我已经改善了你的周期。

+0

似乎很好,我现在试试。要正确删除创建的newNode? – zzari

+0

@zzari在您不再需要该副本时将其删除。如果你不需要复制内容,只是不要用'new'分配。立即推动指针。顺便说一句,我在我的答案有一个小错误,我会立即编辑它 –

+0

更好地调用复制构造函数'newNode = new svm_node(* vettProbX [i]);' –

0

你可以使用模板功能。所以你可以将它用于你的所有类型。

template<typename T> 
std::vector<T> get_50th(std::vector<T> l) { 
    std::vector<T> r; 

    for(size_t it=0; it<l.size(); it+=50) 
    r.push_back(l.at(it)); 

    return r; 
} 
1

首先要注意的事情是,你是存储原料指针内vettProbX

std::vector<svm_node *> vettProbX; 

你能肯定吗? STL容器内的原始指针很好,如果它们是观察指针;但拥有原始指针是不好的和泄漏的来源!

另一个选项可以是使用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]); 
}