2015-11-10 65 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'。 –