Аватар для pito211
187 / 174 / 18
Регистрация: 22.03.2010
Сообщений: 612

Шаблоны, контейнеры, контейнер в контейнере

03.03.2011, 14:09. Показов 3437. Ответов 1
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет!
Задумал написать класс EDeque<Type>

тело
C++
1
2
3
4
5
6
7
8
9
10
11
12
EDeque<string> test1;
    EDeque<EDeque<string> > test3;
    string var;
 
    for (int i = 0; i < 3; i++) {
        test1.clear(); //#1
        for (int j = 0; j < 3; j++) {
            cin >> var;
            test1.push_back(var);
        }
        test3.push_back(test1); //#2
    }
не работает, если брать контейнер внутри контейнера. При первом проходе он нормально помещает test1 в test3, смотрел деббагером. При втором проходе в месте #1 он поидеи должен очистить test1, он его очищает и при этом повреждается test3! Как они могут друг от друга зависеть при clear?
вот код EDeque<Type>
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
#pragma once
 
#ifndef EDEQUE_H
#define EDEQUE_H
 
#include "EDequeItem.h"
 
template <typename Type> class EDeque
{
public:
 
    EDeque<Type>(): begin(0), end(0), _size(0) {  } //Пустой список
    /*EDeque(const EDeque &Q): begin(0), end(0) { //Инициализация копии
        copy(Q);
    }*/
    Type &operator[](const int index) {
        EDequeItem<Type> *current = begin;
        for (int i = 0; i < index; i++) {
            current = current->next;
        }
        return current->item;
    }
    /*EDeque& operator=(const EDeque<Type> &target) {
        EDeque<Type> tmp;
        for (int i = 0; i < size; i++) {
            tmp.push_back(target.operator[](i));
        }
        return *this;
    }*/
 
    void push_back(const Type &value); //Добавляет элемент в конец
    void push_front(const Type &value); //В начало
 
    void pop_back();
    void pop_front();
 
    bool empty() {
        return (_size == 0);
        //return (begin == 0); //Устарело
    }
 
    void clear();
    /*~EDeque() { 
        clear();
        delete begin, end, current, _size;
    }*/
 
    int size() {
        return _size;
    }
 
private:
    int _size; // Число элементов
    EDequeItem<Type> *begin;
    //EDequeItem<Type> *current; //Устарело
    EDequeItem<Type> *end;
 
    //EDequeItem *vector;
    /*void copy(const EDeque&);*/
};
 
template <typename Type> void EDeque<Type>::push_back(const Type &value) {
    EDequeItem<Type> *pt = new EDequeItem<Type>(value);
    EDequeItem<Type> *ptemp; //Нужен для обмена между 
 
    if (empty()) {
        begin = pt;
        end = pt;
        end->prev = begin;
    }
    else {
        ptemp = end;
        end->next = pt; //Настройка ссылки на следующий элемент у (бывшего) последнего элемента
 
        end = pt; // Последний элемент ссылается на только что добавленны         
        /*//end->prev = current; //Устарело
        //current = pt;*/        //
        end->prev = ptemp;
    }
 
    _size++;
 
}
 
template <typename Type> void EDeque<Type>::push_front(const Type &value) {
    EDequeItem<Type> *pt = new EDequeItem<Type>(value);
 
    if (empty()) {
        begin = end = pt;
    }
    else {
        begin->prev = pt;
        begin = pt;
    }
 
    _size++;
 
}
 
template <typename Type> void EDeque<Type>::clear() {
    while (!empty()) {
        pop_back();
    }
}
 
template <typename Type> void EDeque<Type>::pop_back() {
    _size--;
    EDequeItem<Type> *pt = end;
    end = end->prev; //Теперь энд указывает на предыдущий объект класса EDequeItem!
    delete pt; //Можно удалить объект ссылавшийся на энд
}
 
template <typename Type> void EDeque<Type>::pop_front() {
    _size--;
    EDequeItem<Type> *pt = begin;
    begin = begin->next; //Теперь бегин указывает на следующий объект класса EDequeItem!
    delete pt; //Можно удалить объект ссылавшийся на энд
}
 
#endif
при таком выводе
C++
1
2
3
4
5
6
for (int i = 0; i < 3; i++) {
        for (int j = 0; j < 3; j++) {
            cout << test3[i][j] << "\t";
        }
        cout << endl;
    }
выводится только последний вектор три раза(

ну и хотелось бы услышать мнение экспертов насчёт читабельности кода? по десятибальной шкале
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
03.03.2011, 14:09
Ответы с готовыми решениями:

Контейнер в контейнере
Необходимо реализовать хранилище данных. Бинарное дерево, в каждом элементе которого стек. Для стека есть ограничение 5 элементов. ...

Шаблоны и контейнеры
Подскажите, пожалуйста, отличия между шаблоном и контейнером (кроме наличия итератора).

Тип значения в контейнере map - контейнер list
Возможно ли использовать следующий код: struct p { int id; }; int main() { map&lt;string, list&lt;p&gt; &gt; m;

1
 Аватар для lemegeton
4901 / 2694 / 920
Регистрация: 29.11.2010
Сообщений: 5,782
03.03.2011, 19:57
Дело в отсутствии конструктора копирования. Без него объект класса не копируется при push_back, а копируется только указатель на первый/последний элемент, а сама очередь остается такой же. Она же и clear()-ом освобождается.

Кстати, а где деструктор? Память бесконечная?
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
03.03.2011, 19:57
Помогаю со студенческими работами здесь

Контейнеры (функция, которая бы помогла отсортировать контейнер List)
составить булевскую функцию, которая бы помогла отсортировать контейнер List. контейнер содержит элементы типа string. я эту функцию...

Шаблоны классов: контейнер. Несколько вопросов
Задача: постоить класс контейнера, параметризовать его, создать вектор с заданным вручную типом. Определил произвольный класс для...

Контейнер в контейнере
Имеется UserControl типа контейнер, внутри его другой контейнер Picture1. Возможно ли средствами VisualBasic / WinApi при загрузке в во...

Достать в контейнере (контейнеры выводятся циклом) именно тот класс, где была нажата кнопка
div class=container div class=result button class=btn /div --------------------- div class=container div class=result button...

Используя шаблоны и исключительные ситуации реализовать класс контейнер пара (pair)
Помогите, пожалуйста, реализовать. Используя шаблоны и исключительные ситуации реализовать класс контейнер пара (pair). Мой код. ...


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

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

Новые блоги и статьи
Blazor и контроллер сервопривода IoT Meadow Maple
Wired 11.07.2025
Я решил разобраться, как можно соединить современные веб-технологии с миром "железа". Интересная комбинация получилась из Blazor в качестве веб-интерфейса и микроконтроллера Meadow с его веб-сервером. . .
Генерация OpenQASM из кода Q#
EggHead 10.07.2025
Летом 2024-го я начал эксперименты с библиотекой Q# Bridge, и знаете что? Она оказалась просто находкой для тех, кто работает на стыке разных квантовых экосистем. Основная фишка этой библиотеки -. . .
Изучаем новый шаблон ИИ-чата .NET AI Chat Web App
stackOverflow 10.07.2025
В . NET появилось интересное обновление - новый шаблон ИИ-чата под названием . NET AI Chat Web App. Когда я впервые наткнулся на анонс этого шаблона, то сразу понял, что Microsoft наконец-то. . .
Результаты исследования от команды ARP (июль 2025 г.)
Programma_Boinc 10.07.2025
Результаты исследования от команды ARP (июль 2025 г. ) Африканский проект по дождям (ARP) World Community Grid снова запущен! Мы рады поделиться обновленной информацией о нашем прогрессе с осени. . .
Angular vs Svelte - что лучше?
Reangularity 09.07.2025
Сегодня рынок разделился на несколько четких категорий: тяжеловесы корпоративного уровня (Angular), гибкие универсалы (React), прогрессивные решения (Vue) и новая волна компилируемых фреймворков. . .
Code First и Database First в Entity Framework
UnmanagedCoder 09.07.2025
Entity Framework дает нам свободу выбора, предлагая как Code First, так и Database First подходы. Но эта свобода порождает вечный вопрос — какой подход выбрать? Entity Framework — это. . .
Как использовать Bluetooth-модуль HC-05 с Arduino
Wired 08.07.2025
Bluetooth - это технология, созданная чтобы заменить кабельные соединения. Обычно ее используют для связи небольших устройств: мобильных телефонов, ноутбуков, наушников и т. д. Работает она на частоте. . .
Руководство по структурам данных Python
AI_Generated 08.07.2025
Я отчетливо помню свои первые серьезные проекты на Python - я писал код, он работал, заказчики были относительно довольны. Но однажды мой наставник, взглянув на мою реализацию поиска по огромному. . .
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах
Programma_Boinc 08.07.2025
Тестирование энергоэффективности и скорости вычислений видеокарт в BOINC проектах Опубликовано: 07. 07. 2025 Рубрика: Uncategorized Автор: AlexA Статья размещается на сайте с разрешения. . .
Раскрываем внутренние механики Android с помощью контекста и манифеста
mobDevWorks 07.07.2025
Каждый Android-разработчик сталкивается с Context и манифестом буквально в первый день работы. Но много ли мы задумываемся о том, что скрывается за этими обыденными элементами? Я, честно говоря,. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru