2013-05-20 2 views
0

Мне просто интересно, есть ли более читаемый способ комбинирования значений двух векторов?Объединение значений двух векторов разного размера

#include <vector> 
#include <iostream> 

int main(int argc, char ** argv) 
{ 
    std::vector<int> v1 = { 1, 2, 3, 7 }; 
    std::vector<int> v2 = { 1, 2, 3, 5, 19 }; 
    std::vector<int>::iterator v2it = v2.begin(); 

    if(v1.size() > v2.size()) 
    { 
     for(auto v1it = v1.begin(); v1it != v1.end(); ++v1it) 
     { 
      *v1it = *v1it + *v2it; 
      std::cout << *v1it << std::endl; 
      ++v2it; 
     } 
    } 
    else 
    { 
     auto v1it = v1.begin(); 

     for(auto v2it = v2.begin(); v2it != v2.end(); ++v2it) 
     { 
      *v2it = *v2it + *v1it; 
      std::cout << *v2it << std::endl; 
      ++v1it; 
     } 
    } 



    return 0; 
} 

Выход выше:

+2

определяют комбината. –

+1

** Ваш код сломан. ** Он делает так много итераций, как размер * длинного * вектора. При этом он пытается получить доступ к несуществующим элементам * короткого * вектора. Это незаконно. Вопрос требует «сделать его более читаемым», хотя на самом деле неясно, что нужно делать. Это невозможно вывести из сломанного кода. Государство осмысленно, что вы пытаетесь сделать. Как вы хотите «объединить» значение векторов разной длины? – AnT

+0

ОК, я тонкий, есть [ответ] (http://stackoverflow.com/questions/3376124/how-to-add-element-by-element-of-two-stl-vectors) – maverik

ответ

3

Вы можете использовать std::transform(), которая предполагает диапазоны одинаковой длины. Я оставлю это вам в качестве упражнения, чтобы узнать, как обработать случай для диапазонов различной длины:

#include <vector> 
#include <iterator> 
#include <iostream> 
#include <algorithm> 
#include <functional> 

int main() 
{ 
    std::vector<int> v1 = { 1, 2, 3, 7 }; 
    std::vector<int> v2 = { 1, 2, 3, 5, 19 }; 

    std::transform(begin(v1), end(v1), begin(v2), 
        std::ostream_iterator<int>(std::cout, " "), std::plus<int>()); 
} 

Вот live example.

+0

+1 для std :: plus, без каких-либо функторов, lambdas и т. д. – maverik

+0

Спасибо. Теперь мне просто интересно почему вопрос был закрыт, чтобы я мог улучшить его, если ему нужно =/ – Tek

+0

@maverik: и все же цикл для печати результата вместо 'std :: copy (v1.begin(), v1.end(), std :: ostream_iterator (std :: cout, "")); ' –

2

Если вы хотите сделать математику с векторами, вы должны смотреть на std::valarray

+0

hooray для запоминания 'valarray'! –

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