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

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
helloy
0 / 0 / 0
Регистрация: 15.11.2013
Сообщений: 46
#1

Изменить приращение используемое функцией, автоматически изменялось для уменьшения кол-ва вызовов - C++

28.12.2013, 00:38. Просмотров 166. Ответов 0
Метки нет (Все метки)

Нужно изменить пример так, чтобы приращение используемое функцией inflate(), автоматически изменялось для уменьшения кол-ва вызовов. Например при каждом вызове приращение для следующего вызова может увеличиваться в двое.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
//MY.cpp
//...
template<class T, int incr>
void PStash<T, incr>::inflate(int increase) {
  const int psz = sizeof(T*);
  T** st = new T*[quantity + increase];
  memset(st, 0, (quantity + increase) * psz);
  memcpy(st, storage, quantity * psz);
  quantity += increase;
  delete []storage; // Old storage
  storage = st; // Point to new memory
}
//...
require.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
//: :require.h
#ifndef REQUIRE_H
#define REQUIRE_H
 
#include <cstdio>
#include <cstdlib>
#include <fstream>
 
inline void require(bool requirement, 
  const char* msg = "Requirement failed") {
  using namespace std;
  if (!requirement) {
    fputs(msg, stderr);
    fputs("\n", stderr);
    exit(1);
  }
}
 
inline void requireArgs(int argc, int args, 
  const char* msg = "Must use %d arguments") {
  using namespace std;
   if (argc != args + 1) {
     fprintf(stderr, msg, args);
     fputs("\n", stderr);
     exit(1);
   }
}
 
inline void requireMinArgs(int argc, int minArgs,
  const char* msg = 
    "Must use at least %d arguments") {
  using namespace std;
  if(argc < minArgs + 1) {
    fprintf(stderr, msg, minArgs);
    fputs("\n", stderr);
    exit(1);
  }
}
  
inline void assure(std::ifstream& in, 
  const char* filename = "") {
  using namespace std;
  if(!in) {
    fprintf(stderr,
      "Could not open file %s\n", filename);
    exit(1);
  }
}
 
inline void assure(std::ofstream& in, 
  const char* filename = "") {
  using namespace std;
  if(!in) {
    fprintf(stderr,
      "Could not open file %s\n", filename);
    exit(1);
  }
}
#endif // REQUIRE_H ///:~


MY.cpp
Кликните здесь для просмотра всего текста
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
#include "require.h"
#include <iostream>
#include <fstream>
#include <set> 
#include <string>
using namespace std;
 
 
class AutoCounter {
  static int count;
  int id;
 
  class CleanupCheck {
    std::set<AutoCounter*> trace;
  public:
    void add(AutoCounter* ap) {
      trace.insert(ap);
    }
    void remove(AutoCounter* ap) {
      require(trace.erase(ap) == 1,
        "Attempt to delete AutoCounter twice");
    }
    ~CleanupCheck() {
      std::cout << "~CleanupCheck()"<< std::endl;
      require(trace.size() == 0,
       "All AutoCounter objects not cleaned up");
    }
  };
   CleanupCheck verifier;
  AutoCounter() : id(count++) {
    verifier.add(this); // Register itself
    std::cout << "created[" << id << "]" 
              << std::endl;
  }
  // Prevent assignment and copy-construction:
  AutoCounter(const AutoCounter&);
  void operator=(const AutoCounter&);
public:
  // You can only create objects with this:
  static AutoCounter* create() { 
    return new AutoCounter();
  }
  ~AutoCounter() {
    std::cout << "destroying[" << id 
              << "]" << std::endl;
    verifier.remove(this);
  }
  // Print both objects and pointers:
  friend std::ostream& operator<<(
    std::ostream& os, const AutoCounter& ac){
    return os << "AutoCounter " << ac.id;
  }
  friend std::ostream& operator<<(
    std::ostream& os, const AutoCounter* ac){
    return os << "AutoCounter " << ac->id;
  }
}; 
 
 int AutoCounter::count=0;
 
template<class T, int incr = 10>
class PStash {
  int quantity; // Number of storage spaces
  int next; // Next empty space
  T** storage;
public:
  void inflate(int increase = incr);
  PStash() : quantity(0), next(0), storage(0) {}
  ~PStash();
  int add(T* element);
  T* operator[](int index) const; // Fetch
  // Remove the reference from this PStash:
  T* remove(int index);
  // Number of elements in Stash:
  int count() const { return next; }
};
 
template<class T, int incr>
int PStash<T, incr>::add(T* element) {
  if(next >= quantity)
    inflate(incr);
  storage[next++] = element;
  return(next - 1); // Index number
}
 
// Ownership of remaining pointers:
template<class T, int incr>
PStash<T, incr>::~PStash() {
  for(int i = 0; i < next; i++) {
    delete storage[i]; // Null pointers OK
    storage[i] = 0; // Just to be safe
  }
  delete []storage;
}
 
template<class T, int incr>
T* PStash<T, incr>::operator[](int index) const {
  require(index >= 0,
    "PStash::operator[] index negative");
  if(index >= next)
    return 0; // To indicate the end
  require(storage[index] != 0, 
    "PStash::operator[] returned null pointer");
  // Produce pointer to desired element:
  return storage[index];
}
 
template<class T, int incr>
T* PStash<T, incr>::remove(int index) {
  // operator[] performs validity checks:
  T* v = operator[](index);
  // "Remove" the pointer:
  if(v != 0) storage[index] = 0;
  return v;
}
 
template<class T, int incr>
void PStash<T, incr>::inflate(int increase) {
  const int psz = sizeof(T*);
  T** st = new T*[quantity + increase];
  memset(st, 0, (quantity + increase) * psz);
  memcpy(st, storage, quantity * psz);
  quantity += increase;
  delete []storage; // Old storage
  storage = st; // Point to new memory
}
 
 
int main() {
  PStash<AutoCounter> acStash;
  for(int i = 0; i < 10; i++)
    acStash.add(AutoCounter::create());
  cout << "Removing 5 manually:" << endl;
  for(int j = 0; j < 5; j++)
    delete acStash.remove(j);
  cout << "Remove two without deleting them:"
       << endl;
  // ... to generate the cleanup error message.
  cout << acStash.remove(5) << endl;
  cout << acStash.remove(6) << endl;
  cout << "The destructor cleans up the rest:"
       << endl;
  // Repeat the test from earlier chapters: 
  ifstream in("MY.cpp");
  assure(in, "MY.cpp");
  PStash<string> stringStash;
  string line;
  while(getline(in, line))
    stringStash.add(new string(line));
  // Print out the strings:
  for(int u = 0; stringStash[u]; u++)
    cout << "stringStash[" << u << "] = "
         << *stringStash[u] << endl;
} ///:~
0
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
28.12.2013, 00:38
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Изменить приращение используемое функцией, автоматически изменялось для уменьшения кол-ва вызовов (C++):

QtCreator вешается при большом кол-ве вызовов qDebug - C++ Qt
Собственно, сабж. Может есть какие-то опции на этот счет?

Найти: а) приращение радиус-вектора dr; б) модуль приращения |dr|; в) приращение модуля d|r| - Механика
Начальное значение радиус-вектора равно r1 = 4i—3j+12k, конечное — r2 = —i — 2j + 2k. Найти: а) приращение радиус-вектора dr; б) модуль...

Определение кол-ва нечетных элементов массива с функцией - C++
Здравствуйте,помогите пожалуйста с нахождением ошибки в коде,программа всегда выдает 0. #include &quot;stdafx.h&quot; #include &lt;stdio.h&gt; ...

Запрос к БД Acces для расчета кол-ва лет и кол-ва дней до ДР - Delphi БД
Добрый день! Очень нужна помощь! Есть БД в Access: простенькая табличка: ФИО, День рождения В делфи пишу прогу. На форме в таблицу...

Массив: изменить массив так, чтобы в начале находились отрицательные элементы в порядку их уменьшения... - Delphi
Здравствуйте! Обращаюсь с просьбой. Дали задачу, а решить не могу. Дан массив {X} размерностью n Нужно изменить его так, чтобы в...

Сделать таблицу n строк: адрес, кол-во проживающих, кол-во комнат и кол-во метров в каждой комнате - Java SE
В задании нужно сделать таблицу n строк. Адрес, кол-во проживающих, кол-во комнат и кол-во метров в каждой комнате. public class second {...

Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
28.12.2013, 00:38
Привет! Вот еще темы с ответами:

как автоматически изменить название ячейки? - MS Excel
У меня вопрос. Как мне сделать так, чтобы названия ячеек менять автоматически, например, в ячейке D1 изменить на &quot;Т в зоне закалки&quot;. В...

Автоматически сгенерировать некоторое количество целых чисел и подсчитать: кол-во полож и отриц чисел - LabVIEW
Задание сделать на Labview. автоматически сгенерировать некоторое количество целых чисел и подсчитать: а) количество положительных чисел...

Автоматически изменить значение в определенной ячейке таблицы - MySQL
Добрый день, уважаемые пользователи ! Скажите пожалуйста, можно ли средствами MySQL реализовать автоматическое изменение значений в опред....

Лог вызовов для unity3d - Unity, Unity3D
Есть желание иметь в своем проекте лог вызовов для отладки. Пробовал использовать log4net с patternLayout = &quot;... %M&quot;, но скорость подобного...


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

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

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