2015-11-10 67 views
0

我尝试将一个矢量上一个矢量复制到另一个矢量中currentVector in C++。在C++中复制并遍历矢量

我的代码如下。 我想浏览currentVector并根据值的条件,在之前的矢量中添加元素。我不确定这是正确的做法。

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; 
} 
+4

正确的方法是'的std :: copy_if' – 101010

+1

任何理由为什么你使用一个指针将你的向量传递给函数而不是引用? –

+0

如果你不希望通过'nullptr'你最好通过(const)引用,而不是指针 – Slava

回答

0

我想浏览currentVector和基于值条件下,previousVector添加元素。

如果你的目的是要增加,你迭代元素,那么这正是std::copy_if是:

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

如果您打算做你的代码做什么,然后你根本不需要currentVector,因为它的值似乎不用于任何事情。你的代码的作用是:它将someValue添加到previousVector,并将它n次,其中n是条件为真的previousVector中的元素数。如果这是真的,你想要什么,那么这是一个简单的方法来做到这一点:

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

OP复制整个矢量,然后根据条件添加新元素,它如何与'std :: copy_if'相关? – Slava

+0

@Slava假设OP的代码做他们想做的事情通常是不安全的。我回答说如何去做引用的欲望。如果这不是OP所期望的,那么我可能会误解他们的要求。 – user2079303

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()); 
+0

为什么你的临时矢量更高效?它意味着分配两次内存,一次为临时向量'tmp',并再次插入'previousVector'。你至少应该使用'previousVector.reserve(previousVector.size()+ tmp.size())' –

+0

@JonathanWakely比复制整个'previousVector'并将数据添加到循环中'previousVector'更有效率。我认为这很明显,为什么。 – Slava

+0

我不清楚,你提到的低效率是由于深拷贝造成的,因为你似乎认为“使用临时向量”是解决方案,但根本不做这个拷贝是重要的部分。你的答案。你可以避免复制并直接添加到'previosVector'而不使用'tmp'(通过迭代使用索引而不是迭代器)。另外,OP显然可以使用C++ 11,因为原始代码使用'auto'。 –