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

Задания на стеки/очереди (без шаблонных классов stack, queue) - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Определить количество М-значных натуральных чисел, у которых сумма цифр, стоящих в нечетных разрядах, равна N http://www.cyberforum.ru/cpp-beginners/thread1183161.html
Определить количество М-значных натуральных чисел, у которых сумма цифр, стоящих в нечетных разрядах, равна N (1<N< 30, 0<М<5).
C++ Продублировать в массиве все положительные элементы с четными номерами 7.21. Дан целочисленный массив размера Н. Продублировать в нем все положительные элементы с четными номерами и удалить все отрицательные элементы с нечетными номерами. http://www.cyberforum.ru/cpp-beginners/thread1183158.html
C++ Найти на отрезке [m, n] натуральное число, имеющее наибольшее количество делителей
Найти на отрезке натуральное число, имеющее наибольшее количество делителей.
Помогите найти ошибки в коде: Построить список из слов длинна которых задана пользователем C++
Необходимо из ряда слов разделенных запятыми построить список из слов длинна которых задана пользователем, помогите найти ошибки в коде. #include "stdafx.h" #include <iostream> #include <string> #include <vector> #include <string.h> using namespace std;
C++ Инициализация динамического массива http://www.cyberforum.ru/cpp-beginners/thread1183152.html
int main() { int a, i = 0; int *array = new int ; std::cout << "Enter numbers " << std::endl; while(std::cin >> a) { i < 10; array = a; std::cout << *array << std::endl; }
C++ Что делает код? цитата из переведённой книги Александреску по языку D: "Если кто-то из ваших коллег прокачал самоуверенность до уровня Супермена, спросите его, что делает код object.template fun<arg>(), и вы увидите криптонит в действии." И что же он делает? подробнее

Показать сообщение отдельно
outoftime
║XLR8║
508 / 430 / 33
Регистрация: 25.07.2009
Сообщений: 2,295
21.05.2014, 12:49     Задания на стеки/очереди (без шаблонных классов stack, queue)
katkat95, Набросал высоко продуктивный стек (:

katkat95, поигрался немного с copy assignable & move assignable. Тестировал на коде:
Кликните здесь для просмотра всего текста
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
#include <iostream>
#include <chrono>
 
 
template <typename T>
class stack {
public:
    stack(const size_t& default_capasity = 10)
        : capacity(default_capasity), size(0), a(new T[capacity]) { }
        
    stack(const stack& copy) 
        : capacity(copy.capacity), size(copy.size), a(new T[capacity])
    {
        for (size_t i = 0; i < size; ++i)
            a[i] = copy.a[i];
    }
    
    stack(stack&& local) 
        : capacity(local.capacity), size(local.size), a(local.a) 
    {
        local.a = nullptr;
    }
    
    ~stack() { delete a; }
    
    stack<T>& operator=(const stack<T>& copy) {
        capacity = copy.capacity;
        size = copy.size;
        
        delete a;
        a = new T[capacity];
        for (size_t i = 0; i < size; ++i)
            a[i] = copy.a[i];
        
        return *this;
    }
    
    stack<T>& operator=(stack<T>&& copy) {
        capacity = copy.capacity;
        size = copy.size;
        a = copy.a;
        copy.capacity = copy.size = 0;
        copy.a = nullptr;
        
        return *this;
    }
    
    void push(const T& value) {
        if (size >= capacity)
            resize(capacity * 1.6); 
                
        a[size++] = value;
    }
    
    T pop() {
        if (size < 1)
            throw "stack pop: invalid stack size";
            
        return std::move(a[--size]);
    }
    
    size_t getSize() const { return size; }
 
private:
    void resize(const size_t& value) {
        capacity = value;
        if (size >= capacity) size = capacity; // in case of decreasing 
        
        T* copy = new T[value];
        for (size_t i = 0; i < size; ++i)
            copy[i] = std::move(a[i]); // move assignable
        
        delete a;
        a = copy;
    }
 
    size_t capacity;
    size_t size;
    T* a;   
};
 
stack<int> get() {
    const int n = 100000000; // 400 millions bytes
    stack<int> res(n);
    for (size_t i = 0; i < n; ++i) {
        res.push(i);
    }
    return res;
}
 
int main () {
    stack<int> a = std::move(get()), b, c;
    std::chrono::time_point<std::chrono::system_clock> start, end;
    std::chrono::duration<double> duration;
    
    start = std::chrono::system_clock::now();
    b = a;
    end = std::chrono::system_clock::now();
    duration = end - start;
    std::cout << "Copy: " << duration.count() << '\n';
    
    start = std::chrono::system_clock::now();
    c = std::move(a);
    end = std::chrono::system_clock::now();
    duration = end - start;
    std::cout << "Move: " << duration.count() << '\n';
}

Результат ожидаемый, но все же очень греет душу (:
Bash
1
2
3
4
ruslan@TFTM-K53TA:~/Programming/c++/cyberforum$ make && ./main 
clang++ main.cpp -o main -std=c++11 -W
Copy: 5.00565
Move: 1.132e-06
Копирование 400 миллионов байт обошлось в 5 секундное зависание, а перемещение указателя в 1 микросекунду (:
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru