Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 4.75/4: Рейтинг темы: голосов - 4, средняя оценка - 4.75
0 / 0 / 0
Регистрация: 04.08.2021
Сообщений: 257

Создание стека на основе вектора

03.05.2024, 00:29. Показов 918. Ответов 11
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем привет! Нужно создать стек на основе вектора, но чтобы значения располагались не в обратном порядке

Хотел реализовать таким способом:
C++
1
2
std::vector<int> v1{ 1,2,3,4,5 };
    std::stack<int, vector<int>> s1(v1.rbegin(), v1.rend());
Но такого конструктора нет
0
Programming
Эксперт
39485 / 9562 / 3019
Регистрация: 12.04.2006
Сообщений: 41,671
Блог
03.05.2024, 00:29
Ответы с готовыми решениями:

Создание стека на основе линейного списка
В функции main разработать программу работы с символьным стеком, реализующую операции добавления и удаления элементов из стека и...

Пример использование стека на основе массива и на основе двунаправленного списка
здраствуте, можете привести примеры использывания стека на основе массива(1 код) и стек на основе двунаправленного списка(2...

Создание класс для работы с хеш-таблицей на основе массива стека
Работаю в программе borland c++ builder 6 Получил задание Не знаю как реализовать идею В методичке был такой код(сама методичка...

11
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
03.05.2024, 00:47
Цитата Сообщение от agent070 Посмотреть сообщение
Но такого конструктора нет
Есть, начиная с C++23. И в этом случае не нужны reverse итераторы.
Цитата Сообщение от agent070 Посмотреть сообщение
Нужно создать стек на основе вектора, но чтобы значения располагались не в обратном порядке
"Ручками" чем не устраивает?
0
0 / 0 / 0
Регистрация: 04.08.2021
Сообщений: 257
03.05.2024, 00:52  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
"Ручками" чем не устраивает?
типа push в цикле? А вот красиво в 1 строчку нельзя?

Добавлено через 4 минуты
Цитата Сообщение от zayats80888 Посмотреть сообщение
"Ручками" чем не устраивает?
И задача как я понимаю создать уже забитый стек этими значениями, а не пустой и добавлять
0
Заблокирован
03.05.2024, 00:58
Цитата Сообщение от agent070 Посмотреть сообщение
И задача как я понимаю создать уже забитый стек этими значениями, а не пустой и добавлять
Так не получится.
0
0 / 0 / 0
Регистрация: 04.08.2021
Сообщений: 257
03.05.2024, 01:01  [ТС]
Цитата Сообщение от SmallEvil Посмотреть сообщение
Так не получится.
//Создайте стек таким образом, чтобы
//а) элементы стека стали копиями элементов вектора
//б) при выводе значений как вектора, так и стека порядок значений был одинаковым

Понял, вообще задача вот такая)

Тогда нужно функцию Print как-то перегружать? Потому что по тз она должна быть шаблоном для stack, queue, priority_queue

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
template<typename C> void Print(C c) {
    while(!c.empty()) {
        std::cout << c.top() << " ";
        c.pop();
    }
    std::cout << std::endl;
}
 
template<typename T> void Print(std::queue<T> q) {
    while (!q.empty()) {
        std::cout << q.front() << " ";
        q.pop();
    }
    std::cout << std::endl;
}
Но тут тоже наверно нужно объединить функцию, дублирование одного и того же когда не очень хорошо(
0
03.05.2024, 01:03

Не по теме:

Цитата Сообщение от SmallEvil Посмотреть сообщение
Так не получится.
А чего удалил код? "Задачу" он решает.

0
Заблокирован
03.05.2024, 01:10
Цитата Сообщение от agent070 Посмотреть сообщение
вообще задача вот такая)
Тогда нужно функцию Print как-то перегружать? Потому что по тз она должна быть шаблоном для stack, queue, priority_queue
Таки что мешает заполнить стек в цикле ?
Ну и ещё, стек нельзя "распечатать".
У него не произвольный доступ к элементам.
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
03.05.2024, 01:33
agent070,
C++
1
2
  std::vector<int> v1{ 1,2,3,4,5 };
  std::stack<int, std::vector<int>> s1({v1.rbegin(), v1.rend()});
Кликните здесь для просмотра всего текста
Цитата Сообщение от agent070 Посмотреть сообщение
Тогда нужно функцию Print как-то перегружать? Потому что по тз она должна быть шаблоном для stack, queue, priority_queue
Нужно написать функцию выводящую на экран stack, queue и priority_queue
0
0 / 0 / 0
Регистрация: 04.08.2021
Сообщений: 257
03.05.2024, 11:56  [ТС]
Цитата Сообщение от zayats80888 Посмотреть сообщение
Нужно написать функцию выводящую на экран stack, queue и priority_queue
Мне понравился вариант , который предложил ТС, только хотел бы попробовать реализовать эту идею не множественным дублированием кода шаблонной функции с разными параметрами, а одним шаблоном с 2 шаблонными типами, например:
C++
1
2
3
4
5
6
template <typename T, typename C> const T& Element(C<T>& st) { //Хотелось бы чтобы в типе C подразумевалось std::stack || //std::queue || std::priority_queue, а T это тип значения контейнера, такое вообще возможно? 
//А вообще при передаче в функцию, например, std::stack<int>, компилятор не сможет инстанцировать весь этот тип как "C"?
    return st.top();
//А тут уже сравнить тип параметра(например typeid(st).name можно использовать? и если тип queue, то сделать if и else на top или front соответственно )
 
};
Надеюсь более менее корректно сформировал свою мысль

Видел еще варианты с constexpr, но мы такое еще не проходили
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
03.05.2024, 12:07
Цитата Сообщение от agent070 Посмотреть сообщение
/Хотелось бы чтобы в типе C подразумевалось std::stack || //std::queue || std:riority_queue, а T это тип значения контейнера, такое вообще возможно?
//А вообще при передаче в функцию, например, std::stack<int>, компилятор не сможет инстанцировать весь этот тип как "C"?
Если "контейнер" - шаблон и может иметь более 1 параметра, то при условии, что тип элемента всегда первый, можно так:
C++
1
2
3
template<template <class...> class C, class T, class... Ts> const T& Element(C<T, Ts...>& st) {
...
}
А вообще, все стандартные контейнеры и адапторы экпортируют value_type.
Цитата Сообщение от agent070 Посмотреть сообщение
например typeid(st).name можно использовать?
Нафига? Смотри в сторону специализации шаблонов.
0
0 / 0 / 0
Регистрация: 04.08.2021
Сообщений: 257
03.05.2024, 13:09  [ТС]
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
template<typename T> typename T::value_type queue(T& q) {
    return q.front();
}
 
template<typename T> typename T::value_type stack(T& q) {
    return q.top();
}
 
 
template<typename T> typename void Print(T q) {
    
        while (!q.empty()) {
            if (typeid(T).name() != typeid(std::queue<typename T::value_type>).name()) {
                std::cout << stack(q) << " ";
            }
            else {
                std::cout << queue(q) << " ";
            }
            q.pop();
        }
}
Попробовал сделать вот так) видимо front() и top() нельзя заносить в одну функцию(хоть он до блока else никогда и не дойдет, если у него нет метода front()), значит только специализацией или перегрузкой можно реализовать
0
 Аватар для zayats80888
6352 / 3523 / 1428
Регистрация: 07.02.2019
Сообщений: 8,995
03.05.2024, 13:49
Цитата Сообщение от agent070 Посмотреть сообщение
специализацией
c++17, попробуй разобраться
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
#include <iostream>
#include <queue>
#include <stack>
#include <type_traits>
#include <vector>
 
template <class C, class = void> struct Printer {
  static void print(const C &c) {
    for (auto const &el : c)
      std::cout << el << ' ';
    std::cout << '\n';
  }
};
 
template <template <class...> class> struct Tpl;
 
template <template <class...> class T, template <class...> class... Ts>
constexpr bool AnyOfV = std::disjunction_v<std::is_same<Tpl<T>, Tpl<Ts>>...>;
 
template <template <class...> class C, class... Ts>
struct Printer<C<Ts...>,
               std::enable_if_t<AnyOfV<C, std::priority_queue, std::stack>>> {
  using Container = C<Ts...>;
  static void print(Container const &c) {
    Container copy(c);
    while (!copy.empty()) {
      std::cout << copy.top() << ' ';
      copy.pop();
    }
    std::cout << '\n';
  }
};
 
template <class... Ts> struct Printer<std::queue<Ts...>> {
  using Container = std::queue<Ts...>;
  static void print(Container const &c) {
    Container copy(c);
    while (!copy.empty()) {
      std::cout << copy.front() << ' ';
      copy.pop();
    }
    std::cout << '\n';
  }
};
 
template <class C> void print(const C &c) { Printer<C>::print(c); }
 
int main() {
  std::vector<int> v{1, 2, 3, 4, 5};
  std::stack<int> s({v.rbegin(), v.rend()});
  std::queue<int> q({v.begin(), v.end()});
  std::priority_queue<int> pq({v.begin(), v.end()});
  print(v);
  print(s);
  print(q);
  print(pq);
}


Добавлено через 16 минут
то же самое + перегрузка функции взятия элемента

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
#include <iostream>
#include <queue>
#include <stack>
#include <type_traits>
#include <vector>
 
template <class C, class = void> struct Printer {
  static void print(const C &c) {
    for (auto const &el : c)
      std::cout << el << ' ';
    std::cout << '\n';
  }
};
 
template <class... Ts> decltype(auto) getElement(std::stack<Ts...> const &c) {
  return c.top();
}
template <class... Ts>
decltype(auto) getElement(std::priority_queue<Ts...> const &c) {
  return c.top();
}
template <class... Ts> decltype(auto) getElement(std::queue<Ts...> const &c) {
  return c.front();
}
 
template <template <class...> class> struct Tpl;
 
template <template <class...> class T, template <class...> class... Ts>
constexpr bool AnyOfV = std::disjunction_v<std::is_same<Tpl<T>, Tpl<Ts>>...>;
 
template <template <class...> class C, class... Ts>
struct Printer<
    C<Ts...>,
    std::enable_if_t<AnyOfV<C, std::priority_queue, std::stack, std::queue>>> {
  using Container = C<Ts...>;
  static void print(Container const &c) {
    Container copy(c);
    while (!copy.empty()) {
      std::cout << getElement(copy) << ' ';
      copy.pop();
    }
    std::cout << '\n';
  }
};
 
template <class C> void print(const C &c) { Printer<C>::print(c); }
 
int main() {
  std::vector<int> v{1, 2, 3, 4, 5};
  std::stack<int> s({v.rbegin(), v.rend()});
  std::queue<int> q({v.begin(), v.end()});
  std::priority_queue<int> pq({v.begin(), v.end()});
  print(v);
  print(s);
  print(q);
  print(pq);
}


Добавлено через 2 минуты

Не по теме:

С концептами все конеш проще и читабельнее будет

0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
inter-admin
Эксперт
29715 / 6470 / 2152
Регистрация: 06.03.2009
Сообщений: 28,500
Блог
03.05.2024, 13:49
Помогаю со студенческими работами здесь

Создание стека на основе массива
Выдает ошибку в методе resize, подскажите почему?

Создание класса для работы с хеш-таблицей на основе массива стека
Задали задание В методичке кроме описанного ниже класса нет больше ничего. может кто поможет с заданием . Знаю только что...

Реализация стека на основе массива
Само задание: Реализовать стек на основе массива 1. проверку пустоты стека 2. проверка заполненности стекового массива 3....

Реалилизация стека на основе массива
Напишите пожалуйста реализауию стека на основе массива pyton

Заполнение стека на основе односвязного списка
Не могу разобраться как заполнять стек на основе односвязного списка если в структуре несколько элементов. Почему он подчеркивает...


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

Или воспользуйтесь поиском по форуму:
12
Ответ Создать тему
Новые блоги и статьи
PhpStorm 2025.3: WSL Terminal всегда стартует в ~
and_y87 14.12.2025
PhpStorm 2025. 3: WSL Terminal всегда стартует в ~ (home), игнорируя директорию проекта Симптом: После обновления до PhpStorm 2025. 3 встроенный терминал WSL открывается в домашней директории. . .
Access
VikBal 11.12.2025
Помогите пожалуйста !! Как объединить 2 одинаковые БД Access с разными данными.
Новый ноутбук
volvo 07.12.2025
Всем привет. По скидке в "черную пятницу" взял себе новый ноутбук Lenovo ThinkBook 16 G7 на Амазоне: Ryzen 5 7533HS 64 Gb DDR5 1Tb NVMe 16" Full HD Display Win11 Pro
Музыка, написанная Искусственным Интеллектом
volvo 04.12.2025
Всем привет. Некоторое время назад меня заинтересовало, что уже умеет ИИ в плане написания музыки для песен, и, собственно, исполнения этих самых песен. Стихов у нас много, уже вышли 4 книги, еще 3. . .
От async/await к виртуальным потокам в Python
IndentationError 23.11.2025
Армин Ронахер поставил под сомнение async/ await. Создатель Flask заявляет: цветные функции - провал, виртуальные потоки - решение. Не threading-динозавры, а новое поколение лёгких потоков. Откат?. . .
Поиск "дружественных имён" СОМ портов
Argus19 22.11.2025
Поиск "дружественных имён" СОМ портов На странице: https:/ / norseev. ru/ 2018/ 01/ 04/ comportlist_windows/ нашёл схожую тему. Там приведён код на С++, который показывает только имена СОМ портов, типа,. . .
Сколько Государство потратило денег на меня, обеспечивая инсулином.
Programma_Boinc 20.11.2025
Сколько Государство потратило денег на меня, обеспечивая инсулином. Вот решила сделать интересный приблизительный подсчет, сколько государство потратило на меня денег на покупку инсулинов. . . .
Ломающие изменения в C#.NStar Alpha
Etyuhibosecyu 20.11.2025
Уже можно не только тестировать, но и пользоваться C#. NStar - писать оконные приложения, содержащие надписи, кнопки, текстовые поля и даже изображения, например, моя игра "Три в ряд" написана на этом. . .
Мысли в слух
kumehtar 18.11.2025
Кстати, совсем недавно имел разговор на тему медитаций с людьми. И обнаружил, что они вообще не понимают что такое медитация и зачем она нужна. Самые базовые вещи. Для них это - когда просто люди. . .
Создание Single Page Application на фреймах
krapotkin 16.11.2025
Статья исключительно для начинающих. Подходы оригинальностью не блещут. В век Веб все очень привыкли к дизайну Single-Page-Application . Быстренько разберем подход "на фреймах". Мы делаем одну. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru