Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Для новичков > проблема с вводом значений в vector


Автор: v_123 8.3.2008, 11:10
Неоходимо считать последовательность строк из потока ввода до слова quit.
Подскажите, пожалуйста, почему после операции  in.push_back(temp); или in[i]=temp; 
в функции f2(), vector <string> in остается пустым, по крайней мере cout << in[i]; ничего не выводит.
И, желательно, - как правильно присваивать значения вектору.

Код

#include <iostream>
#include <string>
#include <vector>
#include <algorithm>
using namespace std;

string buf;
vector <string> in(10);
int i=0;

void f1()
{    
    i=0;
    do 
    {    
        cin >>buf;
        cout << buf << " ";
    }
    while (buf!="quit");
};

void f2()
{
    int i=0;
    string temp;
    
    do
    {
        cin >> temp;
        in.push_back(temp);
        in[i]=temp;
        i++;
        cout << "in[" <<i<< "] = " << in[i] << "  temp = " << temp << '\n';
        
    }
    while (in[i]!="quit");
}
/*struct a
{
    int date;
    int date2;
};
*/

int main ()
{    
    f2();
    
    return 0;
}


Добавлено через 9 минут и 58 секунд
Сам разобрался. 

      
Код

i++;
cout << "in[" <<i<< "] = " << in[i] << "  temp = " << temp << '\n';


нужно было поменять на 
Код

cout << "in[" <<i<< "] = " << in[i] << "  temp = " << temp << '\n';
i++;



Автор: bsa 8.3.2008, 12:33
Данная последовательность команд:
Код
std::string str;
std::cin >> str;
Считает тебе только одно слово.
Чтобы читать строку, нужно делать так:
Код
std::string str;
std::getline(std::cin, str);

Чтобы запихать значение в вектор достаточно только вызова метода in.push_back(temp), а in[i] = temp - лишняя операция.

Автор: v_123 8.3.2008, 15:01
Спасибо.
bsa
Код

in.push_back(temp); 

на самом деле в коде был 
Код

// in.push_back(temp);

т.к он почему то не работает, т.е

Код

cout << in[i]; 

ничего не выводит. 
Не подскажите почему?



Автор: bsa 8.3.2008, 18:07
Код
#include <vector>
#include <string>
#include <iostream>

typedef std::vector<std::string> StringVector;

int main()
{
    StringVector vec;
    //загрузка из стандартного ввода
    while(std::cin.good()) {
        std::string str;
        std::getline(std::cin, str);
        if (str == "quit")
            break;
        vec.push_back(str);
        //std::cout << vec.back() << std::endl; //отладочный вывод
    }

    //последовательный перебор всех элементов вектора
    for(StringVector::const_iterator i = vec.begin(), end = vec.end(); i != end; ++i)
        std::cout << *i << std::endl; //и вывод на консоль
    return 0;
}

Автор: korian 8.3.2008, 20:09
комменты:

Код

using namespace std; //хреновый стиль однако...

string buf;
vector <string> in(10); //создание вектора с 10-ю пустыми (значение "") элементами.
int i=0;

void f2()
{
    int i=0;
    string temp;
    
    do
    {
        cin >> temp;
        in.push_back(temp); //добавление НОВОГО элемента в КОНЕЦ массива (т.е. в вашем случае in[i+10] == temp)
        in[i]=temp; //ну тут одна из строк лишняя, вы, как я понял, в курсе
        i++; //ну тут понятно, местами поменяли...
        cout << "in[" <<i<< "] = " << in[i] << "  temp = " << temp << '\n';
        
    }
    while (in[i]!="quit");
}
int main ()
{    
    f2();
    
    return 0;
}


и зачем стока лишнего кода? неужели так трудно поудалять лишнее?
чтоб людям читающим это было удобней и быстрее найти ошибку

bsa, можна сказать написал идеальный вариант, как это должно быть.

Автор: v_123 9.3.2008, 16:33
Почему после: 

 
Код

        сin >> temp;
        in.push_back(temp);

        
cout <<  in[i];  ничего не выводит 

а после:

   
Код

       сin >> temp;
       in[i]=temp;
   


все в порядке


Автор: bsa 9.3.2008, 17:32
Цитата(v_123 @ 9.3.2008,  16:33)
Почему после: 

 
Код

        сin >> temp;
        in.push_back(temp);

        
cout <<  in[i];  ничего не выводит 

а после:

   
Код

       сin >> temp;
       in[i]=temp;
   


все в порядке

Попробуй так:
Код
cin >> temp;
in.push_back(temp);
cout << in[in.size()-1] << endl; //или, что тоже самое: in.back()
Надеюсь, догадаешься почему так, работает.  smile 

Автор: v_123 9.3.2008, 17:42
Догадался. Спасибо.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)