在C ++中复制并迭代向量

时间:2015-11-10 16:05:22

标签: c++ vector copy

我尝试将矢量 previousVector 复制到C ++中的另一个矢量 currentVector

我的代码如下。 我想导航 currentVector 并根据值的条件,在 previousVector 中添加元素。我不确定这是正确的做法。

int ChooseElement(std::vector<Powers>* previousVector) {
    std::vector<Powers> currentVector(*previousVector);
    for(auto iter = currentVector.begin(); iter != currentVector.end(); iter++ ) {
      if(condition on (*iter)) 
        (*previousPowers).push_back(someValue);
    }
    return 0
}

main(int argc, const char * argv[]){
    std::vector<myObjectType> listOfElements;
    myObjectType result = myObjectType(1,2);
    listOfElements.push_back(result);
    result = ChooseElements(&listOfElements);
    return 0;
}

2 个答案:

答案 0 :(得分:0)

  

我想导航currentVector并根据值的条件,在previousVector中添加元素。

如果您打算添加您正在迭代的元素,那么这正是std::copy_if的用途:

std::copy_if(currentVector.begin(), currentVector.end(),
             std::back_inserter(previousVector), condition_functor);

如果您打算执行代码所做的事情,那么您根本不需要currentVector,因为它的值似乎不会用于任何事情。您的代码所做的是:它将someValue添加到previousVector并执行nnpreviousVector中元素的数量,其条件是真正。如果这确实是你想要的,那么这是一种更简单的方法:

void ChooseElement(std::vector<Powers>& v) {
    auto count = std::count_if(v.begin(), v.end(), condition_functor);
    v.insert(v.end(), count, someValue);
}

答案 1 :(得分:0)

您的push_back()应该没问题,因为currentVector是原始向量的深层副本,因此对previousVector的操作根本不会影响它。但是这种方法非常无效,请使用临时向量:

int ChooseElement(std::vector<Powers> &previousVector) {
    std::vector<Powers> tmp;
    for(auto iter = previosVector.begin(); iter != previousVector.end(); iter++ )   {
      if(condition on (*iter)) 
        tmp.push_back(someValue);
    }
    std::move( tmp.begin(), tmp.end(), std::back_inserter( previousVector ) );      
    return 0;
}

如果您不能使用c ++ 11,请将std::move()替换为:

   previosVector.insert( previosVector.end(), tmp.begin(), tmp.end() );