Добавление векторов - PullRequest
       23

Добавление векторов

0 голосов
/ 23 апреля 2011

Упражнение P6.07 из C ++ Для всех: Напишите функцию vector<int> append(vector<int> a, vector<int> b), которая добавляет b после a

Ex. a is 1 4 9 16 и b is 9 7 4 9 11, затем возвращается 1 4 9 16 9 7 4 9 11

Моя функция

vector<int> append(vector<int> a, vector<int> b)
{
    vector<int> appended;

    for (unsigned int i = 0; i < a.size(); i++)
    {
        appended.push_back(a[i]);
    }

    for (unsigned int i = 0; i < b.size(); i++)
    {
        appended.push_back(b[i]);
    }

    return appended;
}

Одна из моих попыток:

int main()
{
    cout << "Enter some numbers: ";
    int input, input2;
    vector<int> a, b;
    while (cin >> input)
    {
        if (cin.fail())
        {
            cout << "Enter some numbers: ";
            while (cin >> input2)
            {
                if (cin.fail()) {break;}
                else {b.push_back(input2);}
            }
        }
        else {a.push_back(input);}
    }
    return 0;
}

Как бы я использовал cin, чтобы получить векторы a и b при запуске функции main()?

Ответы [ 3 ]

3 голосов
/ 23 апреля 2011

Вам необходимо очистить флаги ошибок std::cin, если вы хотите использовать его снова после сбоя.

Что касается добавления, почему бы не зарезервировать и вставить?

void append(std::vector<int>& a, const std::vector<int>& b)
{
    a.reserve(a.size() + b.size());
    a.insert(a.end(), b.begin(), b.end());
}
1 голос
/ 24 апреля 2011

Вы задаете два вопроса: как добавить два вектора и как ввести два набора чисел.

Что касается первого, я бы использовал std::vector::insert, как описали другие. Что касается второго, у меня есть две альтернативы.

Вы можете использовать значение часового (например, -1, если все другие числа положительны), чтобы указать конец первого списка. Если это не вариант, вы можете прочитать первый набор чисел в одной строке вместо нескольких строк.

Вот две программы, которые делают то, что вы пытаетесь сделать.

Во-первых, программа, которая использует -1 в качестве значения часового:

#include <iostream>
using std::cin;
using std::cout;

#include <iterator>
using std::ostream_iterator;

#include <vector>
using std::vector;


int main()
{
    int i;
    vector<int> v1;
    while(cin >> i) {
        if(i == -1)
            break;
        v1.push_back(i);
    }
    vector<int> v2;
    while(cin >> i)
        v2.push_back(i);

    v1.insert(v1.end(), v2.begin(), v2.end());

    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, ", "));
} 

Далее, программа, которая читает первый набор чисел из одной строки, а второй набор чисел из следующей строки:

#include <iostream>
using std::cin;
using std::cout;
using std::getline;
using std::ostream;
using std::istream;

#include <sstream>
using std::stringstream;

#include <iterator>
using std::ostream_iterator;

#include <vector>
using std::vector;

#include <string>
using std::string;


vector<int>
fetch(ostream& os, istream& is)
{       
    vector<int> result;
    os << "Enter several values, all one one line:\n";
    string line;
    getline(is, line);
    stringstream sline(line);
    int i;
    while(sline >> i)
        result.push_back(i);
    return result;
}

int main()
{
    vector<int> v1(fetch(cout, cin));
    vector<int> v2(fetch(cout, cin));

    v1.insert(v1.end(), v2.begin(), v2.end());
    copy(v1.begin(), v1.end(), ostream_iterator<int>(cout, ", "));
    cout << "\n";
}
0 голосов
/ 23 апреля 2011

Это не ответ, но я хотел бы отметить интересную вещь об этом:

while (cin >> input)
{
    if (cin.fail())
    //...
}

Я не вижу никакой точки if внутри while.В случае сбоя cin>>input цикл прерывается даже перед выполнением if.

Это означает, что блок while в вашем коде сводится к следующему:

while (cin >> input)
{
    a.push_back(input);
}

Это эквивалентно вашему while блоку!

...