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

Интрузивный и не интрузивный список - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ несовместимость типов http://www.cyberforum.ru/cpp-beginners/thread827389.html
помогите разобраться, передаю в функцию update_table массив указателей на фигуры, для каждой из которых должна вызываться add_to_table. какие аргументы должна содержать функция add_to_table?? .... void add_to_table(table *T,figure *F) { char *B; B=&(T->A); *(B+8*(8-(F->y))+(F->x-65))=F->type; }
C++ Преобразование С++ Не знаю как разрулить один ньюанс. Есть динамический массив симолов.(char mass=new char; ) Есть динамический массив даблов.(double chisla=new double; ) я ввожу массив mass с клавиатуры и выполняю проверку на числа. если я ввёл число,то записываем это число в массив chisla. но есть одно НО,которое я не знаю как решить. к примеру я введу 146. 1 - это нулевой элемент массива chisla,4 -... http://www.cyberforum.ru/cpp-beginners/thread827374.html
C++ метод Ньютона
Дано уравнение f(x)=0. Найти с точностью e корень уравнения содержащиеся на отрезке . Составить программу для нахождения корня по методу Ньютона. Я видела, что кто-то скидывал решение, но не могу открыть файл, скопируйте пожалуйста программу!
Вычислить значение выражения C++
В основной программе ввести входные данные, и вызвав собственные функции, вычислить значение выражения и результаты
C++ Исправьте ошибку для ленточной стр. симетр. матрицы http://www.cyberforum.ru/cpp-beginners/thread827359.html
Дана разреженная ленточная матрица. Найти матрицу, обратную к ней. Помогите исправить ошибку #include "stdafx.h" #include <iostream> #include <cstdlib> using namespace std; void Input(double ** array, int size) {
C++ Структуры.Вывести список Здраствуйте. Помогите,пожалуйста,с програмой, немного не понимаю как сделать В отделе кадров хранится список преподавателей университета, в котором указано Ф.И.О. преподавателя, его возраст, должность, факультет, на котором работает преподаватель. Вывести список доцентов младше 55 лет. #include <iostream> using namespace std; struct { char fio; int vik; подробнее

Показать сообщение отдельно
lemegeton
2917 / 1346 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
03.04.2013, 23:15     Интрузивный и не интрузивный список
Интрузивные контейнеры это такая хитрая концепция, позволяющая хранить только данные. При этом сами данные должны заботиться о том, чтобы их можно было хранить. В случае хранения в виде двусвязного списка, сама хранимая структура должна иметь некие указатели на следующий и предыдущий элементы. При этом интрузивный контейнер не создает дополнительных объектов типа "нод" для хранения каждой единицы данных.

Такая концепция хороша тем, что не создает копий объектов и использует меньше памяти для работы с ними, но в то же время приходится дополнительно следить за временем жизни объекта вне контейнера.


Обратите внимание, в классе-контейнере ничего не аллоцируется, не удаляется, не создается копий...
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
#include <ctime>
#include <cstdlib>
#include <iostream>
 
struct Storable {
  int number;
  Storable *prev, *next;
};
 
template <class T>
class IntrusiveStorage {
 public:
  IntrusiveStorage() : origin(0) {}
  void pushBack(T &data) {
    if (origin == 0) {
      origin = &data;
      origin->next = origin;
      origin->prev = origin;
    } else {
      data.next = origin;
      data.prev = origin->prev;
      data.next->prev = data.prev->next = &data;
    }
  }
  T &getLast() {
    if (origin == 0) {
      // Г*ГҐГІ Г¤Г*Г*Г*ûõ, èñêëþ÷åГ*ГЁГҐ?
    }
    return *(origin->prev);
  }
  void popBack(T &data) {
    if (origin == 0) {
      // Г*ГҐГІ Г¤Г*Г*Г*ûõ, èñêëþ÷åГ*ГЁГҐ?
    }
    if (origin->next = origin) {
      origin = 0;
    } else {
      T *data = origin->prev;
      data->prev->next = data->next;
      data->next->prev = data->prev;
    }
  }
 private:
  T *origin;
};
 
int main(int argc, char **argv) {
  srand(time(0));
  IntrusiveStorage<Storable> storage;
  
  Storable s;
  s.number = 5;
  storage.pushBack(s);
  std::cout << storage.getLast().number << std::endl;
  
  std::cin.get();
  return 0;
}
Мое мнение -- с этим довольно трудно работать, легче хранить стандартный контейнер указателей. Смысл тот же, оверхеад не чудовищный.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru