Форум программистов, компьютерный форум CyberForum.ru

Непонятно, как работает push_back - C++

Восстановить пароль Регистрация
 
MatMatRix
 Аватар для MatMatRix
1 / 1 / 0
Регистрация: 13.03.2013
Сообщений: 24
06.09.2013, 16:25     Непонятно, как работает push_back #1
Задали на неделю сделать программы, где нужно использовать std::vector. Сами алгоритмы для них я продумала (для второй программы он точно должен работать), но у меня возникли проблемы с командой push_back.

1) Не совсем первая программа, но код, который к ней сводится (и в нём та же проблема):

C++
1
2
3
4
5
    vector<char> h; char q;
 
    q=')';
    h.push_back(q);
    if(h.empty()) printV(h); else cout<<"ERROR"<<endl;
Судя по тому, что мне в ответ выводится "ERROR", команда push_back не записала символ q.

2) Кусок кода программы, которая сначала требует ввести число учеников, потом имя каждого ученика (вводится список по рейтингу), а затем сортирует их в алфавитном порядке.

C++
1
2
3
4
5
6
7
8
9
    unsigned int N; vector<rate> Sigma;
 
    cin>>N;
    for(unsigned int i=1;i<=N;i++){
        string o;
 
        getline(cin,o);
        Sigma.push_back(make_pair(o,i));
    }
Какое бы N у меня ни было, первый ученик почему-то оказывается безымянным, то есть строка, содержащая его имя, остаётся пустой.

А теперь вопрос: где у меня ошибки?
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
06.09.2013, 16:30     Непонятно, как работает push_back #2
Цитата Сообщение от MatMatRix Посмотреть сообщение
if(h.empty()) printV(h); else cout<<"ERROR"<<endl;
else означает что h не пуст так как не выполнилось условие h.empty()
MatMatRix
 Аватар для MatMatRix
1 / 1 / 0
Регистрация: 13.03.2013
Сообщений: 24
06.09.2013, 16:33  [ТС]     Непонятно, как работает push_back #3
Цитата Сообщение от Raali Посмотреть сообщение
else означает что h не пуст так как не выполнилось условие h.empty()
Спасибо! Так, с командой empty разобралась. Сейчас попробую первую прогу доделать. Теперь осталась вторая.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
06.09.2013, 16:34     Непонятно, как работает push_back #4
Цитата Сообщение от MatMatRix Посмотреть сообщение
первый ученик почему-то оказывается безымянным
а где и как вы это определяете?
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
06.09.2013, 16:45     Непонятно, как работает push_back #5
Может ошибка в структуре rate? К примеру, вот так должно все работать:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <iostream>
#include <string>
#include <vector>
 
struct rate
{
   std::string name;
   int rating;
 
   rate(const std::string& s, int r): name(s), rating(r) {}
};
 
int main()
{
   std::vector<rate> Sigma;
   std::string name;
   unsigned int N;
   (std::cin >> N).get();
   for(unsigned int i = 0; i<N; ++i)
   {
      std::cout << "Enter name: ";
      std::getline(std::cin, name);
      Sigma.push_back(rate(name, i));
   }
   for(std::vector<rate>::iterator it = Sigma.begin(); it != Sigma.end(); ++it)
      std::cout << (*it).name << ", " << (*it).rating << std::endl;
 
   std::cout << "\nDone" << std::endl;
   return 0;
}
MatMatRix
 Аватар для MatMatRix
1 / 1 / 0
Регистрация: 13.03.2013
Сообщений: 24
06.09.2013, 17:40  [ТС]     Непонятно, как работает push_back #6
Может ошибка в структуре rate? К примеру, вот так должно все работать:
Понимаете, в чём дело... Прошу прощения, что я сразу не сказала, но мне нужно непременно использовать структуру pair, которая определяется просто: template<class T1, class T2> struct pair{T1 first; T2 second}. Попытки вместо string в первую переменную пары, которую я обозначила как rate (чисто для удобства), запихнуть const string& оборачиваются кучей ругани от Visual C++ с указанием непосредственно в код, где эти pair определены.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
#include<iostream>
#include<vector>
#include<algorithm>
#include<string>
using namespace std;
 
typedef pair<string, unsigned int> rate;
 
void ShowMeStudents(vector<rate> &v){
    for(unsigned int a=0;a<v.size();a++){
        cout<<v[a].first<<" "<<"("<<v[a].second<<")"<<endl;
    }
    cout<<endl;
}
 
int main(){
    unsigned int N; vector<rate> Sigma; string o;
 
    cin>>N;
    for(unsigned int i=1;i<=N;i++){
        getline(cin,o);
        Sigma.push_back(rate(o,i));
    }
    sort(Sigma.begin(),Sigma.end());
    ShowMeStudents(Sigma);
    return 0;
}
Вот как моя прога сейчас выглядит. Кстати, к вопросу:

а где и как вы это определяете?
Я в код вписала тестовую строчку, выводящую единицу во время выполнения каждой итерации в цикле, из чего я заметила, что на первой итерации компилятор как будто вообще не знает о строке ничего. Откуда это, я понять не могу.
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
06.09.2013, 17:46     Непонятно, как работает push_back #7
нужна реализация класса pair
rate(o,i) - точнее вот этого конструктора pair(T1,T2)
MatMatRix
 Аватар для MatMatRix
1 / 1 / 0
Регистрация: 13.03.2013
Сообщений: 24
06.09.2013, 17:50  [ТС]     Непонятно, как работает push_back #8
нужна реализация класса pair
rate(o,i) - точнее вот этого конструктора pair(T1,T2)
Вот так определяется "пара" (частный случай struct):

C++
1
2
3
4
5
6
7
pair<T1, T2>
 
template <class T1, class T2> struct pair
{
    T1 first;
    T2 second;
};
Raali
572 / 276 / 12
Регистрация: 06.07.2013
Сообщений: 917
Завершенные тесты: 1
06.09.2013, 17:54     Непонятно, как работает push_back #9
по всей видимости нужно так

C++
1
2
3
4
5
6
7
8
template<class T1, class T2> struct pair
{
T1 first;
T2 second;
 
pair(T1 f,T2 s) : first(f), second(s) {}
 
};
а в коде элемент добавлять пару так

rate *r = new rate(o,i);
Sigma.push_back(*r);
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
06.09.2013, 18:05     Непонятно, как работает push_back #10
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
#include <iostream>
#include <string>
#include <vector>
 
typedef std::pair<std::string, unsigned int> rate;
 
void ShowMeStudents(const std::vector<rate>& v)
{
    for(unsigned int i = 0; i<v.size(); ++i){
        std::cout << v[i].first << " " << "(" << v[i].second << ")" << std::endl;
    }
    std::cout << std::endl;
}
 
int main()
{
   std::vector<rate> Sigma;
   std::string name;
   unsigned int N;
   (std::cin >> N).get();
   for(unsigned int i = 0; i<N; ++i)
   {
      std::cout << "Enter name: ";
      std::getline(std::cin, name);
      Sigma.push_back(std::make_pair(name, i));
   }
   ShowMeStudents(Sigma);
 
   std::cout << "\nDone" << std::endl;
   return 0;
}
Добавлено через 5 минут
Сортировка по имени:
C++
1
2
std::sort(Sigma.begin(), Sigma.end(), [](const rate& r1, const rate& r2) 
{return r1.first < r2.first;});
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
06.09.2013, 18:16     Непонятно, как работает push_back
Еще ссылки по теме:

C++ Есть вектор пар, как положить туда значение пары через push_back
C++ Как положить в вектор структур значение через push_back
Push_back(1.) C++

Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
MatMatRix
 Аватар для MatMatRix
1 / 1 / 0
Регистрация: 13.03.2013
Сообщений: 24
06.09.2013, 18:16  [ТС]     Непонятно, как работает push_back #11
Цитата Сообщение от DiffEreD Посмотреть сообщение
C++
1
#include <iostream> ...
Спасибо Вам огромное! (Так всё дело было в make_pair и (cin>>N).get!)
Yandex
Объявления
06.09.2013, 18:16     Непонятно, как работает push_back
Ответ Создать тему
Опции темы

Текущее время: 13:06. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru