Форум программистов, компьютерный форум, киберфорум
Наши страницы
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.88/8: Рейтинг темы: голосов - 8, средняя оценка - 4.88
Beaal
0 / 0 / 1
Регистрация: 28.09.2014
Сообщений: 14
1

Динамическое выделение памяти для Вектора ( не STL)

09.10.2014, 06:57. Просмотров 1659. Ответов 8
Метки нет (Все метки)

привет Ребят,
Задание таково, прога читает слова из файла и в зависимости от выбора опций показывает мне количество уникальных слов, общее количество и печатает мне их в алфавитном порядке.
Когда массив содержал 1000 элементов, все работало, но нужно сделать динамическое выделение памяти,
компилируется, но воспроизвести не могу, Сделан Дамп памяти..
Подскажите, что не так?
скорее всего ошибка в моей insert function

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
#ifndef VECTOR_H
#define VECTOR_H
 
template < class T > class Vector
{
public:
  typedef T *iterator;
  Vector ()
  {
  used =0;cap=2;p=0;
  }
  iterator begin ()
  {
 
  return iterator(p);
  }
  iterator end ()
  {
  return iterator(p+used);
  }
  int size ()
  {
   return used;
  }
 
 
 iterator insert (iterator position, const T & item)
  {
   if(!p)
        {
            cap = 2;
            p = new T[cap];
 
        }
        else if(cap == used) 
        {
            cap = int(cap * 2);
            T* tmp = new T[cap];
            for(int i = 0; i < used; ++i)
            {
                tmp[i] = p[i];
            }
            delete[] p;
            p = tmp;
        }
 
 
 for ( iterator i = end() ; i != position; --i ) 
  *i = *( i - 1 );
  used++;
  *position = item;
 
   return position;
 
 
  
  
  }
private:
  T *p;
  int used;
  int cap;
  
};
 
#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
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
#include <iostream>
#include <unistd.h>
#include <string>
//#include <vector>
//#include <algorithm>
#include "Vector.h"
 
 
using namespace std;
 
 
struct WordInfo
{
  int count;
  string text;
};
WordInfo myText;
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 ();
  //       myText.text = "www";
  // myText.count = 1;
  // uniq.insert (kit, myText);
  // int count = 0;
  int s = 0;
 int totally=0;
 
  while (cin >> word)
    {
      if (uniq.size () == 0)
    {
      myText.count = 1;
      myText.text = word;
        
      uniq.insert (uniq.begin (), myText);
    }
      else
    {
 
 
      Vector < WordInfo >::iterator pit = uniq.begin ();
 
      it = find (uniq.begin (), uniq.end (), word);
 
 
      if (it == uniq.end ())    // заходит в условие если возвращает true нашел такого слова
        {
 
        
          myText.text = word;
          myText.count = 1;
          while (pit != uniq.end ())
        {
          
          if (word.compare ((pit->text)) > 0)
            {
              pit++;
              if ((pit->text) == "")
            {
              uniq.insert (pit, myText);pit = uniq.end ();
            }
 
 
            }
 
 
          else
            {
              uniq.insert (pit, myText);
              pit = uniq.end ();
            }
        }
 
        }
 
 
 
 
      else
        {
          (it->count)++;
 
        }
 
    }
    }
 
 
 
 
 
 
 
  switch (mode)
    {
    case total:
       
       for (Vector < WordInfo >::iterator i = uniq.begin ();
       i < uniq.end (); i++)
    {
      totally=totally+(i->count);
 
 
    }
      cout << "Total: " << totally << endl;
      break;
    case unique:
      cout << "Unique: " << uniq.size () << endl;
      
      break;
    case diff:
 
      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
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2014, 06:57
Ответы с готовыми решениями:

Динамическое выделение памяти для массива
Кто может помочь решить задачу. Для заданного двумерного массива из n строк и...

Динамическое выделение памяти для структур
Добрый день. Есть следующие структуры: typedef struct...

Динамическое выделение памяти для массива
Не могу разобраться, почему программа вызывает точку остановы после выбора...

Динамическое выделение памяти для строки
Подскажите, пожалуйста , почему в данной программе появляются ошибки в строке ...

Динамическое выделение памяти для глобальных переменных
задача стоит такая: с датчика потоком идет информация, её необходимо сохранять...

8
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
09.10.2014, 08:35 2
без комментов и с таким оформлением...желание отпало как-то...
0
Beaal
0 / 0 / 1
Регистрация: 28.09.2014
Сообщений: 14
09.10.2014, 09:10  [ТС] 3
dzrkot, Вам трудно глянуть на одну функцию?
Программа очень проста,
Я не знаю, о каком оформлении идет речь и комментов нет, т к это лабораторная была, не сдаем ее.
0
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
09.10.2014, 09:16 4
Цитата Сообщение от Beaal Посмотреть сообщение
Я не знаю, о каком оформлении идет речь
миллион '\n' режут глаз, не компактно
Цитата Сообщение от Beaal Посмотреть сообщение
Вам трудно глянуть на одну функцию?
я глянул,я не вижу ошибку.

Не по теме:

Цитата Сообщение от Beaal Посмотреть сообщение
Программа очень проста,
так почему вы задаете тогда вопросы, делайте сами

0
Beaal
0 / 0 / 1
Регистрация: 28.09.2014
Сообщений: 14
09.10.2014, 09:26  [ТС] 5
dzrkot, я всегда делаю автоматическое форматирование через терминал..
с миллионами \n мне легче понимать код,

В любом случае спасибо, что хотя бы посмотрели.

Не по теме:

сделала сама, сколько смогла

0
dzrkot
zzzZZZ...
523 / 354 / 94
Регистрация: 11.09.2013
Сообщений: 2,039
09.10.2014, 09:30 6
Цитата Сообщение от Beaal Посмотреть сообщение
с миллионами \n мне легче понимать код,
старайтесь делать компактнее
0
Kuzia domovenok
2421 / 2151 / 525
Регистрация: 25.03.2012
Сообщений: 7,758
Записей в блоге: 1
09.10.2014, 09:48 7
Цитата Сообщение от dzrkot Посмотреть сообщение
так почему вы задаете тогда вопросы, делайте сами
так почему тебе мешает оформление? Программа действительно небольшая!

Добавлено через 1 минуту
Цитата Сообщение от Beaal Посмотреть сообщение
Подскажите, что не так?
https://ru.wikipedia.org/wiki/%D0%9F...D0%B8%D0%B5%29
деструктор, конструктор копирования, оператор присвоения.
Где они?
0
dzrkot
09.10.2014, 09:51
  #8

Не по теме:

Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
так почему тебе мешает оформление? Программа действительно небольшая!
не выспался, зол)

0
Beaal
0 / 0 / 1
Регистрация: 28.09.2014
Сообщений: 14
09.10.2014, 11:14  [ТС] 9
Kuzia domovenok,
спасибо, почитаю, попробую дописать
Дело в том, что понятия деструктор нам не давали и тем более конструктор копирования, оператор присвоения..
Я не очень знаю, как и писать, и использовать, и в чем их суть..
погуглю, спасибо )
даже если без них, я для начала проверяю элементарно в файлом в несколько строк,
вероятно у меня где-то итераторы пытаются выйти за границы вектора, но логика проста, как только размер вектора равен количеству уже имющихся эл-ов, я увеличиваю его размер, т е создаю указатель на бОльший вектор, переписываю туда все, удаляю устарый и меняю указатель на новый бОльший вектор..
0
09.10.2014, 11:14
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
09.10.2014, 11:14

Для чего нужно динамическое выделение памяти
Расскажите пожалуйста про динамическое выделение памяти в примерах если...

Динамическое выделение памяти для структуры в функции
Объясните не могу понять. На С++ пишу совсем недавно. Суть вопроса, при первом...

Динамическое выделение памяти для двумерного массива
нужна помощь вот тело программы, не могу сделать динамическое выделение памяти...


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

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2018, vBulletin Solutions, Inc.
Рейтинг@Mail.ru