2011-04-23 1 views
0

Упражнение 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() ?

+0

Что говорит ваш отладчик? –

+0

Я не понимаю вложенный цикл. И 'while (cin >> input)' уже прерывает цикл при неудачном извлечении: проверка на '.fail()' бесполезна (и в случае внешнего цикла _never invoked_.) –

+0

Прямо сейчас, это просто заканчивается – Alex

ответ

1

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

Что касается первого, я бы использовал 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

У меня уже есть моя функция, которая добавляет 2 вектора, но проблема, с которой я сталкиваюсь, использует' cin' для ввода значений в векторы 'a' и' b', и я уже пробовал свой путь с помощью 2 разделить на циклы, и он просто заканчивается после ввода чисел для 1-го вектора – Alex

+0

Кроме того, я в 2 главах от потоков – Alex

+1

С двумя моими отдельными циклами, не вводите EOF (CTRL-Z или CTRL-D) после первого петля. Вместо этого введите «-1». Затем введите свой второй список. –

0

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

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

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

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

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

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

+0

Если это не ответ, то это комментарий ... –

+0

@Tomalak: Вот как он выглядит в комментарии: Это не ответ, но я хотел бы указать на интересный вещь об этом: в то время как (CIN >> вход) { если (cin.fail()) // ...} Я не вижу ни одной точки, если внутри время. Если сбой cin >> не получается, цикл будет прерываться до выполнения if. Это означает, что блок while в вашем коде сводится к следующему: while (cin >> input) { a.push_back (input); } Это эквивалентно вашему блоку! – Nawaz

+0

@Nawaz: Я сказал почти то же самое в вопросительном комментарии, и все выглядит отлично. –

3

Необходимо удалить флажки ошибок 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()); 
} 
+3

Я бы предпочел бы «вставить» разумно зарезервировать достаточно новое пространство для новых данных, так как он знает с самого начала, сколько ему понадобится. Следовательно, я бы сказал, что pre-'reerve'ing - это преждевременная оптимизация. Не то, чтобы больно. –

+1

@Tomalak, что вы ошибаетесь, потому что нет никакого способа для 'vector <> :: insert()' знать, сколько элементов он собирается вставить, не считая их в первую очередь. И поскольку 'insert()' принимает пару итераторов ввода, он ограничивается одним проходом, и поэтому он выделяет, когда он выполняет итерацию по диапазону ввода. Это может вызвать перераспределение. – wilhelmtell

+1

@wilhelmtell: ну, он может смотреть на категорию итераторов и делать оптимизацию, если они имеют произвольный доступ (что они для вектора) – ltjax