Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.57/7: Рейтинг темы: голосов - 7, средняя оценка - 4.57
0 / 0 / 1
Регистрация: 28.09.2014
Сообщений: 14

Вектор (не из STL) из структур

28.09.2014, 15:07. Показов 1510. Ответов 15
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
привет Ребят,
задача была поставлена так: нужно сделать прогу, которая бы считывала слова из файла, записывала и сортировала их в вектор. Вектор состоит из структуры с текстом( словом, которые мы записали) и int ( количество раз которое слово встречается в файле)
то есть если у меня текст состоит из cat cat dog mouse mouse to вывод должен быть
cat:2
dog:1
mouse:2

Беда в том, что вектор нам нужно было самим писать, а не из библиотеки.
На данном этапе я не могу даже вывести слова, которые записываю, сортировка пока не важна.
Не могли бы объяснить, в чем моя ошибка?

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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
#ifndef VECTOR_H
#define VECTOR_H
 
template < class T > class Vector
{
public:
  typedef T *iterator;
  Vector ()
  {
  used =0;
  }
  iterator begin ()
  {
 
  return &items[0];
  }
  iterator end ()
  {
  return &items[used];
  }
  int size ()
  {
   return used;
  }
 
    void print() {
        std::cout << "[";
        for (iterator i = begin(); i != end(); i++)
            std::cout << *i << ", ";    
        std::cout << "]" << std::endl;  
    }
 
  iterator insert (iterator position, const T & item)
  {
   
 //std::advance(position,used);
 // used++;
 for ( iterator i = end() ; i != position; --i ) 
  *i = *( i - 1 );
//  iterator i = end() - 1;
//  std::cout << "insert:" << *i << std::endl; 
 
  used++;
  *position = item;
 
   return position;
 
 
  
  
  }
private:
  T items[1000];
  int used;
};
 
#endif /* VECTOR_H */
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
#include <iostream>
#include <unistd.h>
#include <string>
//#include <vector>
//#include <algorithm>
#include "Vector.h"
 
 
using namespace std;
 
 
struct WordInfo
{
  int count;
  string text;
};
Vector < WordInfo > uniq;
 
Vector < WordInfo >::iterator find (Vector < WordInfo >::iterator start,
                    Vector < WordInfo >::iterator stop,
                    string value);
 
 
int
main (int argc, char **argv)
{
 
  enum
  { total, unique, diff } mode = total;
  for (int c; (c = getopt (argc, argv, "tui")) != -1;)
    {
      switch (c)
    {
    case 't':
      mode = total;
      break;
    case 'u':
      mode = unique;
      break;
    case 'i':
      mode = diff;
      break;
    }
    }
  argc -= optind;
  argv += optind;
  string word;
  Vector < WordInfo >::iterator it;
  Vector < WordInfo >::iterator kit = uniq.begin ();
  // int count = 0;
  int s = 0;
  int first = 1;
 
  while (cin >> word)
    {
    
      
     
      it = find (uniq.begin (), uniq.end (), word);
         // cout<<uniq.end()<<endl;
         // cout<<it<<"текущий итератор возвращения"<<endl;
 
      if (it == uniq.end ())    // заходит в условие если возвращает конец 
        {
 
          //  uniq.insert (uniq.begin () , word);
          (kit->text) = word;
         // cout << (kit->text)<<endl;
          (kit->count) = 1;
          s++;
          kit++;
        }
      else
        {
          (it->count)++;
 
        }
    
      // for ( vector<word>::iterator i=uniq.begin();i!=uniq.end;i++){
      // i->text = word;
      //где ворд это одна из твоих переменных в стракте, т е доступ к одной из них через     итератор//
    }
 
 
 
 
 
 
  switch (mode)
    {
    case total:
      cout << "Total: " << "count" << endl;
      break;
    case unique:
      cout << "Unique: " << uniq.size () << endl;
      cout << "твой тупой код работает " << s << endl;
      break;
    case diff:
     // cout << (uniq.begin ()+3)->text << endl; если я делаю только один вывод, он выводит мне нужное слово, т е оно записалось в вектор, но в цикл никак не можешь попасть..не понимаю, почему
      for (Vector < WordInfo >::iterator i = uniq.begin (); i != uniq.end ();
       i++)
    {
      cout << i->text << ": " << i->count << endl;
 
 
    }
     break;
    }
}
 
Vector < WordInfo >::iterator find (Vector < WordInfo >::iterator start,
                    Vector < WordInfo >::iterator stop,
                    string value)
{
  Vector < WordInfo >::iterator i = start;
  while (i != stop && (i->text) != value)
    ++i;
  return i;
}
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
28.09.2014, 15:07
Ответы с готовыми решениями:

STL с вектором структур. С++99
С самого начала, говорю что работаю на C++99 под Visual Studio Express 2008 поэтому в коде не должно быть никаких списков инициализации...

Собственный stl-вектор на С++
Решил я разработать свой темплейтный класс для вектора. Итераторные функции begin() и end() работают нормально. А вот rbegin() rend(),...

Вектор наподобие STL
Закончил реализацию. Выкладываю, ибо может кому пригодится. + Кому не лень - пожалуйста просмотрите код, скажите, что плохо сделано, чего...

15
 Аватар для Toshkarik
1181 / 894 / 94
Регистрация: 03.08.2011
Сообщений: 2,461
28.09.2014, 16:24
Цитата Сообщение от Beaal Посмотреть сообщение
std::cout << *i << ", ";
А что по Вашему здесь должно быть выведено?
0
0 / 0 / 1
Регистрация: 28.09.2014
Сообщений: 14
28.09.2014, 16:28  [ТС]
Toshkarik, значение переменной, на которую указывает этот указатель
но мне эта функция не нужна, я могу и в главном файле все вывести, это для тестирования было
Код у меня в целом сейчас неверный

Уже поняла свою грубую ошибку,
нужно делать переменную типа WordInfo, по ходу дела записывать в нее в цикле новые слова и посылать это WordInfo в функцию uniq.insert(блабла)
Затупила, сорри, только прошли структуры
0
 Аватар для igorrr37
2895 / 2042 / 992
Регистрация: 21.12.2010
Сообщений: 3,791
Записей в блоге: 9
28.09.2014, 17:19
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
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
#include <iostream>
#include <fstream>
#include <string>
#include <iterator>
 
struct winfo
{
    winfo() : cntr(0){}
    winfo(std::string const& rhs) : cntr(1), data(rhs){}
    bool operator<(winfo const& rhs)
    {
        return data < rhs.data;
    }
    std::string data;
    int cntr;
};
 
template <class T>
class vector
{
public:
    typedef T* iterator;
 
    vector() : p(0), cap(0), siz(0){}
 
    void push_back(T const& rhs)
    {
        if(!p)
        {
            cap = 2;
            p = new T[cap];
 
        }
        else if(cap == siz) 
        {
            cap = int(cap * 1.5);
            T* tmp = new T[cap];
            for(int i = 0; i < siz; ++i)
            {
                tmp[i] = p[i];
            }
            delete[] p;
            p = tmp;
        }
        p[siz] = rhs;
        ++siz;
    }
 
    iterator begin()
    {
        return iterator(p);
    }
 
    iterator end()
    {
        return iterator(p+siz);
    }
 
    int size() const
    {
        return siz;
    }
 
    ~vector()
    {
        delete[] p;
        p = 0;
    }
 
private:
    vector(vector const&);
    vector& operator=(vector);
    T* p;
    int siz;// size
    int cap;// capacity
};
 
template<class RAIter>
void sort(RAIter ib, RAIter ie)
{
    RAIter i, j;
    typedef typename std::iterator_traits<RAIter>::value_type T;
    T tmp;
    for(i = ib; i != ie; ++i)
    {
        tmp = *i;
        for(j = i - 1; j >= ib && tmp < *j; --j)
        {
            *(j+1) = *j;
        }
        *(j+1) = tmp;
    }
}
 
int main()
{
    std::ifstream ifs("in.txt");
    if(ifs.is_open())
    {
        std::string str;
        vector<winfo> vec;
        while(ifs >> str)
        {
            bool found = false;
            for(vector<winfo>::iterator ib(vec.begin()), ie(vec.end()); ib != ie; ++ib)
            {
                if(ib->data == str)
                {
                    ++(ib->cntr);
                    found = true;
                }
            }
            if(!found)
            {
                vec.push_back(winfo(str));
            }
        }
        ifs.close();
        for(vector<winfo>::iterator ib(vec.begin()), ie(vec.end()); ib != ie; ++ib)
        {
            std::cout << ib->data << ':' << ib->cntr << '\n';
        }
        sort(vec.begin(), vec.end());
        std::cout << "\nAfter sortig:\n";
        for(vector<winfo>::iterator ib(vec.begin()), ie(vec.end()); ib != ie; ++ib)
        {
            std::cout << ib->data << ':' << ib->cntr << '\n';
        }
    }
    else
        std::cerr << "Unable to open input file\n";
    return 0;
}
1
0 / 0 / 1
Регистрация: 28.09.2014
Сообщений: 14
29.09.2014, 11:34  [ТС]
igorrr37, огромное спасибо,
практически то, что нужно, даже с вектором который растет динамически, вообще супер, спасибо большое!

Добавлено через 7 минут
igorrr37, у меня есть некоторые вопросы,
вы в структуре перегрузили оператор сравнения, но нигде это не использовали,почему?
у меня немного иная идея, я сортирую походу вставки, то есть я сначала нахожу правильное место для слова и вставляю, у меня это функция insert а не pushback,поэтому я не делала отдельной функции для сортировки
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2014, 11:41
Цитата Сообщение от Beaal Посмотреть сообщение
вы в структуре перегрузили оператор сравнения, но нигде это не использовали,почему?
Чтобы эту функцию применить, в классе должен быть оператор сравнения:
C++
1
sort(vec.begin(), vec.end());
0
0 / 0 / 1
Регистрация: 28.09.2014
Сообщений: 14
29.09.2014, 11:44  [ТС]
alsav22,
скажите, почему я не могу сравнить две строки?
то есть почему в си++ нельзя просто написать if("cat">"dog"){cout<<"true";} ведь "c"идет раньше"d"
почему это не работает? разве не должно сравнивать в алфавитном порядке?
я делаю код немного иначе и мне нужно строковое сравнение..
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2014, 11:56
Цитата Сообщение от Beaal Посмотреть сообщение
то есть почему в си++ нельзя просто написать if("cat">"dog"){cout<<"true";} ведь "c"идет раньше"d"
Это не стрки С++, это строки Си. Для их сравнения есть функция strcmp().
C++
1
if(strcmp("cat", "dog") > 0){cout<<"true";}
Для строк С++, std::string, есть перегруженные операторы сравнения (>, < и т.д.).
0
0 / 0 / 1
Регистрация: 28.09.2014
Сообщений: 14
29.09.2014, 12:19  [ТС]
alsav22, спасибо,
немного туплю, я все проверила, и с strcmp и просто s1.compare(s2)
все равно не выдает true, выдает обратное, что дог>cat,
где именно я туплю ?

Добавлено через 9 минут
alsav22, все, я погуглила, сорри за глупые вопросы, все поняла
должно быть <0 если первая строка по алфавиту первая
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2014, 12:21
Цитата Сообщение от Beaal Посмотреть сообщение
что дог>cat,
Потому что:
Цитата Сообщение от alsav22 Посмотреть сообщение
"c"идет раньше"d"
0
0 / 0 / 1
Регистрация: 28.09.2014
Сообщений: 14
29.09.2014, 12:23  [ТС]
alsav22, ну смотрите,
cat>dog, потому что "c"идет раньше"d", а вы мне обратное говорите..

должно быть <0 если первая строка по алфавиту первая
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2014, 12:28
Цитата Сообщение от Beaal Посмотреть сообщение
cat>dog, потому что "c"идет раньше"d", а вы мне обратное говорите..
У вас код, что говорит?
Цитата Сообщение от Beaal Посмотреть сообщение
должно быть <0 если первая строка по алфавиту первая
Правильно, но у вас проверка на > 0, а не на < 0, поэтому и false, что и говорит о том, что cat < dog.
0
0 / 0 / 1
Регистрация: 28.09.2014
Сообщений: 14
29.09.2014, 12:31  [ТС]
alsav22, то, что <0 тогда первое слово больше - это просторы интернета поведали,
и теперь у меня работает сортировка на ура)

просто вы сказали, что если >0, то первое слово больше, что, как я понимаю, неверно

Добавлено через 1 минуту
alsav22, в любом случае спасибо, я во всем разобралась
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2014, 12:43
Измените проверку на < 0, и выдаст true.

Добавлено через 1 минуту
Цитата Сообщение от Beaal Посмотреть сообщение
просто вы сказали, что если >0, то первое слово больше, что, как я понимаю, неверно
Правильно сказал. Но код true не выводит, значит условие не выполняется, занчит cat не больше dog.
1
0 / 0 / 1
Регистрация: 28.09.2014
Сообщений: 14
29.09.2014, 12:43  [ТС]
alsav22,скажите, по вашему cat<dog?
вы понимаете, что условие должно проверяться так : <0, это будет значить, что первое слово больше второго?
0
5500 / 4895 / 831
Регистрация: 04.06.2011
Сообщений: 13,587
29.09.2014, 12:50
Цитата Сообщение от Beaal Посмотреть сообщение
скажите, по вашему cat<dog?
При чём здсь я? Есть лексикографическое сравнение, исходя из него cat < dog.
Цитата Сообщение от Beaal Посмотреть сообщение
<0, это будет значить, что первое слово больше второго?
Есть результат лексикографического сравнения, и есть то, как этот результат обрабатывается в коде. Например, в этом примере результат сравнения меньше нуля (первое слово меньше). Если проверить полученный результат на > 0, будет false, если на == 0, будет false, если на < 0, будет true.
http://ru.cppreference.com/w/c... yte/strcmp
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
29.09.2014, 12:50
Помогаю со студенческими работами здесь

STL вектор динамических объектов
Нужно время от времени ложить в std::vector (или std::list) динамические объекты. Под динамическим объектом здесь понимается объект,...

Библиотека STL, класс вектор
Помогите написать прогу... вот задание: Использовать класс vector библиотеки STL для хранения каталога книг. Книги характеризуются...

создать вектор STL в классе
Здравствуйте всем Вопрос касается STL векторов внутри класса. Ситуация такая: есть изображение (двухмерная матрица) био клеток. Нужно...

Как устроен вектор (STL) ?
Вот такой вот вопросец возник. Как организовано хранение вектора в памяти? Последовательно располагаются именно сами данные, или может быть...

STL: как правильно заполнять вектор?
std::vector&lt;char*&gt; files; Объясните пожалуйста как правильно заполнять такой вектор


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

Или воспользуйтесь поиском по форуму:
16
Ответ Создать тему
Новые блоги и статьи
Программный контроль заполнения реквизита табличной части документа
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: реализовать контроль заполнения реквизита табличной части. . .
wmic не является внутренней или внешней командой
Maks 02.04.2026
Решение: DISM / Online / Add-Capability / CapabilityName:WMIC~~~~ Отсюда: https:/ / winitpro. ru/ index. php/ 2025/ 02/ 14/ komanda-wmic-ne-naydena/
Программная установка даты и запрет ее изменения
Maks 02.04.2026
Алгоритм из решения ниже реализован на примере нетипового документа "СписаниеМатериалов", разработанного в конфигурации КА2. Задача: при создании документов установить период списания автоматически. . .
Вывод данных в справочнике через динамический список
Maks 01.04.2026
Реализация из решения ниже выполнена на примере нетипового справочника "Спецтехника" разработанного в конфигурации КА2. Задача: вывести данные из ТЧ нетипового документа. . .
Функция заполнения текстового поля в реквизите формы документа
Maks 01.04.2026
Алгоритм из решения ниже реализован на нетиповом документе "ВыдачаОборудованияНаСпецтехнику" разработанного в конфигурации КА2, в дополнении к предыдущему решению. На форме документа создается. . .
К слову об оптимизации
kumehtar 01.04.2026
Вспоминаю начало 2000-х, университет, когда я писал на Delphi. Тогда среди программистов на форумах активно обсуждали аккуратную работу с памятью: нужно было следить за переменными, вовремя. . .
Идея фильтра интернета (сервер = слой+фильтр).
Hrethgir 31.03.2026
Суть идеи заключается в том, чтобы запустить свой сервер, о чём я если честно мечтал давно и давно приобрёл книгу как это сделать. Но не было причин его запускать. Очумелые учёные напечатали на. . .
Модель здравосоХранения 6. ESG-повестка и устойчивое развитие; углублённый анализ кадрового бренда
anaschu 31.03.2026
В прикрепленном документе раздумья о том, как можно поменять модель в будущем
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru