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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 11, средняя оценка - 4.73
pito211
 Аватар для pito211
186 / 173 / 8
Регистрация: 22.03.2010
Сообщений: 612
03.03.2011, 14:09     Шаблоны, контейнеры, контейнер в контейнере #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;
    }
выводится только последний вектор три раза(

ну и хотелось бы услышать мнение экспертов насчёт читабельности кода? по десятибальной шкале
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2011, 14:09     Шаблоны, контейнеры, контейнер в контейнере
Посмотрите здесь:

Шаблоны классов: контейнер. Несколько вопросов C++
«Шаблоны шаблонов» vs «шаблоны с параметрами-шаблонами». C++
C++ Шаблоны и контейнеры
Помогите писать на С++ через шаблоны. Консуле я писал, но надо писать исползуя шаблоны C++
C++ Позиция элемента в контейнере STL кон. SET, поиск контейнер set словарь позиция
Контейнеры (функция, которая бы помогла отсортировать контейнер List) C++
C++ Наличие элемента в контейнере
Тип значения в контейнере map - контейнер list C++

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

Или воспользуйтесь поиском по форуму:
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
lemegeton
 Аватар для lemegeton
2910 / 1339 / 133
Регистрация: 29.11.2010
Сообщений: 2,720
03.03.2011, 19:57     Шаблоны, контейнеры, контейнер в контейнере #2
Дело в отсутствии конструктора копирования. Без него объект класса не копируется при push_back, а копируется только указатель на первый/последний элемент, а сама очередь остается такой же. Она же и clear()-ом освобождается.

Кстати, а где деструктор? Память бесконечная?
Yandex
Объявления
03.03.2011, 19:57     Шаблоны, контейнеры, контейнер в контейнере
Ответ Создать тему
Опции темы

Текущее время: 09:38. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru