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

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

28.09.2014, 15:07. Показов 1460. Ответов 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
2872 / 2019 / 991
Регистрация: 21.12.2010
Сообщений: 3,744
Записей в блоге: 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
Ответ Создать тему
Новые блоги и статьи
сукцессия микоризы: основная теория в виде двух уравнений.
anaschu 11.01.2026
https:/ / rutube. ru/ video/ 7a537f578d808e67a3c6fd818a44a5c4/
WordPad для Windows 11
Jel 10.01.2026
WordPad для Windows 11 — это приложение, которое восстанавливает классический текстовый редактор WordPad в операционной системе Windows 11. После того как Microsoft исключила WordPad из. . .
Classic Notepad for Windows 11
Jel 10.01.2026
Old Classic Notepad for Windows 11 Приложение для Windows 11, позволяющее пользователям вернуть классическую версию текстового редактора «Блокнот» из Windows 10. Программа предоставляет более. . .
Почему дизайн решает?
Neotwalker 09.01.2026
В современном мире, где конкуренция за внимание потребителя достигла пика, дизайн становится мощным инструментом для успеха бренда. Это не просто красивый внешний вид продукта или сайта — это. . .
Модель микоризы: классовый агентный подход 3
anaschu 06.01.2026
aa0a7f55b50dd51c5ec569d2d10c54f6/ O1rJuneU_ls https:/ / vkvideo. ru/ video-115721503_456239114
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR
ФедосеевПавел 06.01.2026
Owen Logic: О недопустимости использования связки «аналоговый ПИД» + RegKZR ВВЕДЕНИЕ Введу сокращения: аналоговый ПИД — ПИД регулятор с управляющим выходом в виде числа в диапазоне от 0% до. . .
Модель микоризы: классовый агентный подход 2
anaschu 06.01.2026
репозиторий https:/ / github. com/ shumilovas/ fungi ветка по-частям. коммит Create переделка под биомассу. txt вход sc, но sm считается внутри мицелия. кстати, обьем тоже должен там считаться. . . .
Расчёт токов в цепи постоянного тока
igorrr37 05.01.2026
/ * Дана цепь постоянного тока с сопротивлениями и источниками (напряжения, ЭДС и тока). Найти токи и напряжения во всех элементах. Программа составляет систему уравнений по 1 и 2 законам Кирхгофа и. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru