从矢量中获取一些值

时间:2014-02-26 14:59:05

标签: c++ vector

我有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实现相同的东西。

感谢您的帮助。

3 个答案:

答案 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;
}