2016-03-02 2 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 –

ответ

0

Что вы пытаетесь сделать, это как сортировка вставки. https://en.wikipedia.org/wiki/Insertion_sort имеет псевдокод. На каждом шаге вы проверите каждый элемент в векторе 2 и поместите новый элемент, где он принадлежит (while loop).

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

Так начинается vec2 заселена с четырьмя значениями 0, вы никогда не найти элемент, где * Iter1 < = * iter2 если * Iter1 == 0.

Вместо нуля не инициализирует его, чтобы избежать распределения , вы хотите reserve пространство.

vec2.reserve(vec1.size()); 

, а затем вместо того, чтобы для цикла вы можете использовать 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

Смежные вопросы