2016-03-31 2 views
0

Итак, у меня есть эта проблема, с которой я столкнулся при создании кода. Этого вопросуДобавление двух векторов вместе

Эта работа основана на перегрузке операторов, вам нужно построить строку калькулятор, калькулятора может сделать добавлять и минус функция для строковых переменных (будет только
символов и пространство для строка).

Проблема, с которой я столкнулся, - это когда я пытаюсь добавить два вектора, которые я создал вместе. Например, Vector A = < 1,2,3> и Vector B = < 1,2>. Я хочу, чтобы A + B равнялся < 2,4,3>. Но когда я делаю это, я получаю вывод 2. Вот мой код.

#include<iostream> 
#include<string> 
#include<vector> 
using namespace std; 
string a; 
string b; 
int k, j, ab, x; 
vector <int> scab; 
int main() { 

cout << "Input A: "; 
getline(cin, a); 
cout << "Input B: "; 
getline(cin, b); 
    vector<int> sca; 
    vector<int> scb; 
    // For A 
    for (int i = 0; i < a.size(); i++) { 
     sca.push_back(static_cast <int> (a[i])); 
    } 
    cout << "Input A: "; 
    for (int j = 0; j < sca.size(); ++j) 
    { 
     cout << sca[j] << "\t"; 
    } 
    cout << endl; 
    cout << endl; 
    // For B 
    for (int p = 0; p < b.size(); p++) { 
     scb.push_back(static_cast <int> (b[p])); 
    } 
    cout << "Input B: "; 
    for (int j = 0; j < scb.size(); ++j) 
    { 
     cout << scb[j] << "\t"; 
    } 

    scab.push_back(sca[j] + scb[j]); 

    cout << endl; 
    cout << endl; 

cout << "A+B: " << scab[j] << "\t"; 

    system("pause"); 

}

Спасибо заранее.

+0

Рассматривали ли вы [ 'станд :: valarray'] (http://en.cppreference.com/w/cpp/numeric/valarray) вместо 'станд :: VECTOR'? –

+0

Для начала вы должны преобразовать свои входы в 'int', используя, возможно,' std :: istringstream', а не 'static_cast (a [i])', это, вероятно, не то, что вы хотите. –

+0

Этот код даже не компилируется, вы используете переменную цикла j после окончания действия. О, у вас есть еще один «j» в области файлов, который никогда не записывается, поэтому он всегда будет равен нулю. Подумайте об этом на минуту. –

ответ

4

Попробуйте использовать более из стандартной библиотеки, чтобы сделать его проще:

auto size = std::max(sca.size(), scb.size()); 
sca.resize(size); 
scb.resize(size); 

auto scab = std::vector<int>(size); 
std::transform(sca.begin(), sca.end(), scb.begin(), scab.begin(), std::plus<int>()); 
+0

Когда я пытаюсь это сделать, он дает мне сообщение об ошибке« Элемент 1: преобразование из «unsigned int» в «int» требует сужающего преобразования ». Ошибка находится в строке с «auto scab = std :: vector {size}, с подчеркнутым размером. – Bawad

+0

' auto scab = std :: vector {size}; 'неверно, даже если вы его произвели' {static_cast (size)}; '. Он создает вектор с размером' size == 1'. Используйте скобки: 'auto scab = std :: vector (размер);' –

+0

Все еще не работает. Добавляет только первый элемент каждого вектор вместе – Bawad

0

Это следует из вашего кода, что векторы содержат символы, которые представляют собой цифру. Также вы должны учитывать переполнение, которое может произойти.

Вот демонстративная программа, которая показывает, как такой оператор cna будет перегружен для таких векторов.

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

std::vector<int> operator +(const std::vector<int> &a, const std::vector<int> &b) 
{ 
    auto less = [](const std::vector<int> &a, const std::vector<int> &b) 
    { 
     return a.size() < b.size(); 
    }; 

    std::vector<int> c(std::min(a, b, less)); 
    c.resize(std::max(a.size(), b.size()), '0'); 

    int overflow = 0; 

    auto plus = [&overflow](int x, int y) 
    { 
     int sum = x - '0' + y - '0' + overflow; 
     overflow = sum/10; 
     return sum % 10 + '0'; 
    }; 

    std::transform(c.begin(), c.end(), std::max(a, b, less).begin(), c.begin(), plus); 

    if (overflow) c.push_back(overflow + '0'); 

    return c; 
}  

int main() 
{ 
    std::vector<int> a({ '1', '2', '3' }); 
    std::vector<int> b({ '1', '9' }); 

    for (int x : a) std::cout << static_cast<char>(x) << ' '; 
    std::cout << std::endl; 

    std::cout << "+" << std::endl; 

    for (int x : b) std::cout << static_cast<char>(x) << ' '; 
    std::cout << std::endl; 

    std::cout << "=" << std::endl; 

    std::vector<int> c; 
    c = a + b; 

    for (int x : c) std::cout << static_cast<char>(x) << ' '; 
    std::cout << std::endl; 
} 

Выход программы

1 2 3 
+ 
1 9 
= 
2 1 4 

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

Или векторы могут быть объявлены как имеющие тип std::vector<char>

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