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

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

Войти
Регистрация
Восстановить пароль
 
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
#1

Создание своего вектора - C++

16.01.2010, 11:31. Просмотров 1019. Ответов 10
Метки нет (Все метки)

Мне пришлось юзать длинку, для перевода больших чисел в разных системах счисления, юзать СТЛ нельзя, вот и пришлось создавать клас, который будут помогать проводить теже действия что и вектор. На даный момент есть следуущее:
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
class vector
{
    int* a,
         top;
public:
    vector(int &n) { top = 0; a = new int[n]; }
    ~vector(){ delete a; }
    void push_back(int &n)
    {
        a[top++] = n;
    }
    int pop_back()
    {
        return a[--top];
    }
    int back()
    {
        return a[top-1];
    }
    bool empty()
    {
        return !top;
    }
};
на базе этого класа не могу перезагрузить еще два оператора: "=" и "[]", первый - для присваивания вектору значений второго вектора, воторой - для обращения к елементу масива вектора по определенному индексу, как масиве..
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
16.01.2010, 11:31
Здравствуйте! Я подобрал для вас темы с ответами на вопрос Создание своего вектора (C++):

Ошибка при резервировании памяти для своего(!) вектора - C++
Всем здравствуйте! Возможно, из названия темы не совсем понятен вопрос, поэтому уточню саму суть: Пишу свой шаблонный класс вектора и...

Не получается использовать итераторы вектора в качестве итераторов своего класса - C++
Пишу класс матрицы, основанный на векторе. Хочу его сделать stl-совместимым. Т.к. класс основан на векторе, решил возвращать итераторы...

Создание своего класса - C++
Пытаюсь создать свой класс - AM_Demodulator.h Написал вот это, но компилятор ругается #include <iostream> #include <cmath> using...

Создание своего архива и работа с ним - C++
Здравствуйте форумчане! Вопрос таков: можно ли создать свой архив, наподобе какого-нибудь *.pak, чтобы работать с ним могла только моя...

Создание своего формата и хранение данных в нем - C++
Подскажите, как можно создать формат файла, который сможет хранить информацию различного рода. К примеру я хочу, чтобы файл хранил...

Создание своего класса исключений, наследование std::exception - C++
хотел создать свой класс исключений пронаследовав от std::exception, но немного запутался в конструкторах... конструктор же не наследуется,...

10
ISergey
Maniac
Эксперт С++
1376 / 887 / 53
Регистрация: 02.01.2009
Сообщений: 2,663
Записей в блоге: 1
16.01.2010, 11:48 #2
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
#include <iostream>
 
using namespace std;
 
class vector
{
    int* a;
    int size;
    int top;
public:
    vector():size(0), top(0), a(0) { }
 
    vector(int n):size(n), top(0), a(0)
    { 
        a = new int[size];
    }
    vector(const vector& r):size(0), top(0), a(0)
    {
        *this = r; 
    }
 
    ~vector()
    { 
        delete[] a; 
    }
 
    int &operator[] (int i){ return a[i]; }
 
    vector &operator = (const vector& r)
    {
        if(&r == this) return *this;
        delete[] a;
 
        a = new int[r.size];
        for(int i = 0; i < r.size; ++i)
            a[i] = r.a[i];
        size = r.size;
        return *this;
    }
 
    void push_back(int n)
    {
        //Проверку делай чтобы не выйти за пределы массива..
        a[top++] = n;
    }
 
    int pop_back()
    {
        //!
        return a[--top];
    }
 
    int back()
    {
        //!
        return a[top-1];
    }
 
    bool empty()
    {
        return !top;
    }
};
int main()
{
    vector v1(10);
    vector v2;
 
    v1[0] = 1;
    v1[1] = 2;
 
    v2 = v1;
 
    cout << v2[0] << ' ' << v2[1] << endl;
    return 0;
}
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
16.01.2010, 14:27  [ТС] #3
ISergey, насколько я понял, size и есть top.. верно?

Добавлено через 5 минут
Цитата Сообщение от ISergey Посмотреть сообщение
if(&r == this)
сравнение векторов также самому писать? насколько я понимаю чисто класы сравнивать нельзя, даже если у них одинаковые поля и содержимое

Добавлено через 18 минут
а, стоп, там была ссылка, ок все норм..
0
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
16.01.2010, 14:52 #4
outoftime,

правильный вариант empty:

bool empty() const { return !top; }

+ также:

const int& operator[](size_t i) const { return a[i]; }
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
16.01.2010, 15:17  [ТС] #5
ISergey, спасибо еще раз, пока что все норм, не могли бы вы помочь реализировать еще и операции сложения векторов и умножение вектора на число (перенос розрядов и все остальное смогу сам, мне только как перегрузить операторы *=, и +, *= уможение на число, + - сумирование векторов).

Добавлено через 2 минуты
вот что у меня есть пока:
NOTATION.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
#include <iostream>
#include <windows.h>
#include "vector.hpp"
 
#define FOR(i,a,b) for (int i(a), _n(b); i < _n; ++i)
 
//using namespace std;
 
//оголошення констант
const int size = 1000,              //максимальний розмір введених/отриманих данних
          tSleep = 1000,            //час затримки при виході
          base = 1000*1000*1000;    //кількість цифр в одному елементі
 
void Menu();
vector notation(int from, int to, vector key);
 
int main()
{
    Menu();
    return 0;
}
 
void Menu()
{
    while (1)
    {
        int from, to;
        char* s = new char[size];
/*        cout << "Press your orign notation:   " << endl;
        cin >> from;
        cout << "Press your desired notation: " << endl;
        cin >> to;
        cout <<  "Enter number: " << endl;
*/        
        printf("Press your orign notation:   \n");
        scanf("%d",&from);
        printf("Press your desired notation: \n");
        scanf("%d",&to);
        printf("Enter number: \n");
        scanf("%s",&s);
        
        vector in(size);
        FOR(i,0,size)
        {
            if (s[i] == '\n') break;
            in[i] = (int)s[i] - '0';
        }            
        
        vector out = notation(from, to, in);
        
        FOR(i,0,out.size())
            printf("%d",out[i]);
        printf("\n");
                    
        int de;
/*        cout << "1 - Exit\t\t2 - Continue\n";
        cin >> de;
*/
        printf("1 - Exit\t\t2 - Continue\n");
        scanf("%d",&de);
        if (de == 1)
        {
            //cout << "Exiting..";
            printf("Exiting..");
            Sleep(tSleep);
        }
    }
}
 
vector notation(int from, int to, vector key)
{
    vector res(size),
           base(size),
           ds(size);
    ds.push_back(0);
    for (int i(key.size()); i > -1; --i)
    {
        
    }
    base.push_back(1);
    FOR(i,0,key.size())
    return res;
}
и
VECTOR.HPP
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
class vector
{
public:
    vector(int &n): top(0), a(0), sz(n)
    {
         a = new int[n]; 
    }
    vector(const int &n): top(0), a(0), sz(n)
    { 
        a = new int[n]; 
    }
    ~vector()
    { 
        delete[] a; 
    }
    void push_back(int &n)
    {
        if (top == sz) return;
        a[top++] = n;
    }
    void push_back(int n)
    {
        if (top == sz) return;
        a[top++] = n;
    }
    int pop_back()
    {
        return a[--top];
    }
    int back()
    {
        return a[top-1];
    }
    bool empty()
    {
        return !top;
    }
    int size()
    {
        return sz;
    }
    int &operator[] (int &n) 
    { 
        return a[n]; 
    }
    vector &operator = (const vector &n)
    {
        if (&n == this) return *this;
        delete[] a;
        a = new int[n.top];
        for (int i = 0; i < n.top; ++i)
            a[i] = n.a[i];
        top = n.top;
        return *this;
    }
private:
    int* a,
         top,
         sz;
};


Добавлено через 6 минут
Цитата Сообщение от Rififi Посмотреть сообщение
bool empty() const { return !top; }
зачем использовать const ??
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
16.01.2010, 15:20 #6
Цитата Сообщение от outoftime Посмотреть сообщение
зачем использовать const ??
outoftime, почитать можно здесь.
1
Rififi
2359 / 1052 / 44
Регистрация: 03.05.2009
Сообщений: 2,656
16.01.2010, 15:24 #7
outoftime,

зачем использовать const ??

const vector v;

очевидно, что в начальном состоянии этот вектор пуст.
попробуй определить его размер с помощью не-константной версии empty.
1
Genius Ignat
1236 / 774 / 44
Регистрация: 16.09.2009
Сообщений: 2,014
16.01.2010, 15:27 #8
Может кто подскажет как сделать контейнер вектор, а не просто динамический массив.
Для изменение размера динамического массива, где то читал, что используется какой-то специальный
алгоритм, может кто подскажет, как этот алгоритм выглядит.
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
16.01.2010, 20:28  [ТС] #9
Цитата Сообщение от outoftime Посмотреть сообщение
как перегрузить операторы *=, и +, *= уможение на число, + - сумирование векторов
знаете?

Добавлено через 13 минут
по аналогии с vector &operator = перегрузил *=, но это унарная операция, а бинарная - сложение??
C++
1
2
3
4
5
6
vector &operator *= (const int &n)
    {
        for (int i = 0; i < sz; ++i)
            a[i] *= n;
        return *this;
    }
Добавлено через 23 минуты
можете сказать так ли я перегрузил "+":
C++
1
2
3
4
5
6
7
8
    vector &operator + (const vector &b)
    {
        for (int i = 0; i < sz; ++i)
        {
            a[i] = b.a[i];
        }
        return *this;
    }
0
CyBOSSeR
Эксперт С++
2303 / 1673 / 86
Регистрация: 06.03.2009
Сообщений: 3,675
16.01.2010, 20:31 #10
Цитата Сообщение от outoftime Посмотреть сообщение
можете сказать так ли я перегрузил "+":
C++
1
2
3
4
5
6
7
8
    vector &operator + (const vector &b)
    {
        for (int i = 0; i < sz; ++i)
        {
            a[i] = b.a[i];
        }
        return *this;
    }
Необходимо добавить проверку, что вектора имеют одинаковый размер.
1
outoftime
║XLR8║
510 / 432 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
16.01.2010, 20:39  [ТС] #11
значит верно, они у меня все с одинаковым размером, тупо, но так проще.. тем более мне их надо всего 2, размеры векторов задаются константой в NOTATION.CPP
0
16.01.2010, 20:39
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
16.01.2010, 20:39
Привет! Вот еще темы с ответами:

Создание вектора - C++
Всем привет! Начала реализовывать вектор через класс, но потом залез в такие дебри что теперь вижуалка выдает миллион ошибок и ей даже не...

Создание вектора классов - C++
#include &lt;algorithm&gt; #include &lt;vector&gt; #include &lt;stdio.h&gt; #include &lt;iostream&gt; using namespace std; class _my { public: ...

Использование своего объекта своего класса внутри другого - C++
Здравствуйте. Есть класс для работы с матрицами. Все работает. Теперь нужно создать другой класс, где полями будут являться переменные -...

Переписать создание вектора посредством шаблона - C++
Всем доброго времени суток. Ранее уже обращался на этот форум за помощью - и мне помогли (за это низкий поклон). На этот раз я вновь...


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

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

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