2016-03-02 102 views
1

矢量函數emplace() 我的emplace函數不起作用。任何幫助,將不勝感激矢量比較

vector <int> vec1; 
vector <int> vec2(4,0); 
vector <int>::iterator iter1; 
vector <int>::iterator iter2; 

srand(time(NULL)); 

for(i=0; i<5; i++){ 
n =rand()%10+1; 
vec1.push_back(n); 
} 

for(iter1=vec1.begin();iter1<vec1.end();iter1++){ 

for(iter2=vec2.begin();iter2<vec2.end();iter2++){ 

    if(*iter1<=*iter2){ 
    //vec2.emplace(iter1,*iter1); 
    //print(); 
    } 
} 
} 
+0

它看起來像你的_if condition_不會,除非進入vector1中的值爲0.即使在這種情況下,它也不是真的在做你想要的。你確定這個問題是與emplace而不是if?當你說你的「emplace功能不起作用」時,你能解釋一下你的意思嗎?另外,您可能想重新考慮如何對vector2進行排序,還有一些更好的算法。 https://en.wikipedia.org/wiki/Sorting_algorithm#Comparison_of_algorithms –

回答

2
for(iter2=vec2.begin();iter2<vec2.end();iter2++){ 

由於VEC 2開始填充的0四個值,你將永遠不會找到一個元素,其中* iter1 < = * iter2除非* iter1 == 0,

而不是零初始化,以避免分配,你想要reserve的空間。

vec2.reserve(vec1.size()); 

,然後代替for循環,您可以使用std::lower_bound找到插入地點:

#include <iostream> 
#include <vector> 
#include <algorithm> 

void print_vec(const char* label, const std::vector<int>& vec) { 
    std::cout << label << ": "; 
    for (int v : vec) { 
     std::cout << v << ", "; 
    } 
    std::cout << "\n"; 
} 

int main() { 
    std::vector <int> vec1 { 4, 1, 2, 2, 5 }; 
    std::vector <int> vec2; 

    print_vec("v1", vec1); 

    vec2.reserve(vec1.size()); 

    for (int v : vec1) { 
     auto it = std::lower_bound(vec2.begin(), vec2.end(), v); 
     if (it == vec2.end() || *it != v) 
      vec2.emplace(it, v); 
     print_vec("v2", vec2); 
    } 

    print_vec("Fin", vec2); 


    return 0; 
} 

現場演示:http://ideone.com/o5td9K

+0

非常感謝你! – asdas