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

Работа со стеком (как достать элемент из стека?) - C++

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 10, средняя оценка - 4.80
KostyaKulakov
Заблокирован
15.03.2013, 17:53     Работа со стеком (как достать элемент из стека?) #1
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
#include <iostream>
#include <stack>
 
 
 
int main()
{
    std::stack<int> a;
 
    a.push(1);
    a.push(1);
    a.push(1);
    a.push(1);
    a.push(1);
    a.push(5);
    a.push(1);
    a.push(6);
    a.push(1);
    a.push(1);
    a.push(1);
    a.push(1);
 
    for(size_t i=0; i < a.size(); ++i)
        std::cout << a.pop() << "->";
 
 
    return 0;
}
не могу понять, как достать элемент из стека...
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
15.03.2013, 17:58     Работа со стеком (как достать элемент из стека?) #2
Стандартный pop, к сожалению, не возвращает выталкиваемого из стека значения, а просто молча убирает одно значение с вершины стека. Глупый STL.
Я предлагаю так:
C++
1
2
3
4
    while(!a.empty()){
        std::cout << a.top() << "->";
        a.pop();
    }
KostyaKulakov
Заблокирован
15.03.2013, 18:50  [ТС]     Работа со стеком (как достать элемент из стека?) #3
а с листом тогда как быть?
C++
1
#include <list>
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11800 / 6779 / 765
Регистрация: 27.09.2012
Сообщений: 16,829
Записей в блоге: 2
Завершенные тесты: 1
16.03.2013, 13:44     Работа со стеком (как достать элемент из стека?) #4
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
а с листом тогда как быть?
Выводит, например, так можно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <algorithm>
#include <iterator>
#include <list> 
int main(){
    std::list<int> a;
    a.push_back(1);
    a.push_back(3);
    a.push_back(8);
    a.push_back(2);
    a.push_back(7);
    std::copy(a.begin(),a.end(),std::ostream_iterator<int>(std::cout," "));
}
KostyaKulakov
Заблокирован
16.03.2013, 13:48  [ТС]     Работа со стеком (как достать элемент из стека?) #5
Цитата Сообщение от Croessmah Посмотреть сообщение
Выводит, например, так можно:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
#include <iostream>
#include <algorithm>
#include <iterator>
#include <list> 
int main(){
    std::list<int> a;
    a.push_back(1);
    a.push_back(3);
    a.push_back(8);
    a.push_back(2);
    a.push_back(7);
    std::copy(a.begin(),a.end(),std::ostream_iterator<int>(std::cout," "));
}
боже упаси..
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.03.2013, 14:03     Работа со стеком (как достать элемент из стека?) #6
KostyaKulakov, для него определены итераторы. Можно также, как и вектор обойти.
KostyaKulakov
Заблокирован
16.03.2013, 16:09  [ТС]     Работа со стеком (как достать элемент из стека?) #7
Цитата Сообщение от go Посмотреть сообщение
KostyaKulakov, для него определены итераторы. Можно также, как и вектор обойти.
C++
1
2
3
4
for(size_t i = 0; i < vector.size; ++i)
{
     std::cout << vector.at(i);
}
и

C++
1
std::copy(a.begin(),a.end(),std::ostream_iterator<int>(std::cout," "));
разницу чувствуете?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.03.2013, 16:45     Работа со стеком (как достать элемент из стека?) #8
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
for(size_t i = 0; i < vector.size; ++i)
{
* * *std::cout << vector.at(i);
}
Это ни есть хорошо.

Цитата Сообщение от KostyaKulakov Посмотреть сообщение
разницу чувствуете?
Нет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <list>
 
int main() 
{
   std::vector<int> v = { 1, 2, 3 };
   std::list<int> l(std::begin(v), std::end(v));
   
   std::copy(std::begin(v), std::end(v), std::ostream_iterator<int> 
      (std::cout, " "));
   std::copy(std::begin(l), std::end(l), std::ostream_iterator<int> 
      (std::cout, " "));
   std::cout << std::endl;
}
http://liveworkspace.org/code/OVDj4$0
Код
1 2 3 1 2 3
Kuzia domovenok
 Аватар для Kuzia domovenok
1882 / 1737 / 116
Регистрация: 25.03.2012
Сообщений: 5,907
Записей в блоге: 1
16.03.2013, 16:48     Работа со стеком (как достать элемент из стека?) #9
Цитата Сообщение от go Посмотреть сообщение
Это ни есть хорошо.
Нет, как раз то, что ты пишешь называется STL abuse.
Чем больше STL тем хуже читаемость.
KostyaKulakov
Заблокирован
16.03.2013, 16:51  [ТС]     Работа со стеком (как достать элемент из стека?) #10
Цитата Сообщение от go Посмотреть сообщение
Это ни есть хорошо.


Нет.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
#include <list>
 
int main() 
{
   std::vector<int> v = { 1, 2, 3 };
   std::list<int> l(std::begin(v), std::end(v));
   
   std::copy(std::begin(v), std::end(v), std::ostream_iterator<int> 
      (std::cout, " "));
   std::copy(std::begin(l), std::end(l), std::ostream_iterator<int> 
      (std::cout, " "));
   std::cout << std::endl;
}
http://liveworkspace.org/code/OVDj4$0
Код
1 2 3 1 2 3
это бред, код стал трудно читаемым и намного больше, смысл писать больше?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
16.03.2013, 19:30     Работа со стеком (как достать элемент из стека?) #11
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Нет, как раз то,
Читайте внимательно ВЕСЬ диалог.

Цитата Сообщение от KostyaKulakov Посмотреть сообщение
это бред, код стал трудно читаемым и намного больше, смысл писать больше?
Моя одна строка против ваших двух. Где больше? Больше букФ?
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
for(size_t i = 0; i < vector.size; ++i)
так цикл для вывода никто не делает.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
16.03.2013, 20:53     Работа со стеком (как достать элемент из стека?) #12
Цитата Сообщение от Kuzia domovenok Посмотреть сообщение
Стандартный pop, к сожалению, не возвращает выталкиваемого из стека значения, а просто молча убирает одно значение с вершины стека. Глупый STL.
Т.е., по-твоему, pop должен каждый раз создавать и возвращать копию удаляемого объекта? )
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
а с листом тогда как быть?
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
#include <list>
#include <algorithm>
#include <iterator>
#include <iostream>
 
int main()
{
    using IntList = std::list<int>;
    using OstreamIntIter = std::ostream_iterator<int>;
 
    IntList lst = {1, 2, 3, 4, 5};
 
    // 1
    for(IntList::iterator it = lst.begin(); it != lst.end(); ++it)
        std::cout << *it << '\n';
 
    // 2
    for(auto it = lst.begin(); it != lst.end(); ++it)
        std::cout << *it << '\n';
 
    // 3
    for(const auto item : lst)
        std::cout << item << '\n';
 
    // 4
    std::copy(lst.begin(), lst.end(),
              OstreamIntIter(std::cout, "\n"));
}
KostyaKulakov
Заблокирован
17.03.2013, 08:07  [ТС]     Работа со стеком (как достать элемент из стека?) #13
Цитата Сообщение от go Посмотреть сообщение
Читайте внимательно ВЕСЬ диалог.


Моя одна строка против ваших двух. Где больше? Больше букФ?

так цикл для вывода никто не делает.
C++
1
for_each(vec.begin(), vec.end(), [](int i){std::cout << i;});
шах и мат?
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.03.2013, 09:25     Работа со стеком (как достать элемент из стека?) #14
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
шах и мат?
Зачем использовать лямбда, и не использовать цикл for по коллекции?
C++
1
2
3
for (auto &i : vec)
      std::cout << i << " ";
std::cout << std::endl;

Не по теме:

Цитата Сообщение от KostyaKulakov Посмотреть сообщение
шах и мат?
Я смотрю: Вы играть вообще не умеете.

KostyaKulakov
Заблокирован
17.03.2013, 11:51  [ТС]     Работа со стеком (как достать элемент из стека?) #15
Цитата Сообщение от go Посмотреть сообщение
Зачем использовать лямбда, и не использовать цикл for по коллекции?
C++
1
2
3
for (auto &i : vec)
      std::cout << i << " ";
std::cout << std::endl;

Не по теме:


Я смотрю: Вы играть вообще не умеете.

опять же вы используете stl, не обосновано причём. использовать итератор вектора и проверять его каждый раз, затратная операция.
go
Эксперт C++
3582 / 1362 / 128
Регистрация: 16.04.2009
Сообщений: 4,528
17.03.2013, 14:07     Работа со стеком (как достать элемент из стека?) #16
KostyaKulakov, Вы понимаете то, что пишете? Рекомендую прибегнуть к разделу Литература C++ . Рекомендую начать с Hello, World!!! раздела.
KostyaKulakov
Заблокирован
17.03.2013, 16:47  [ТС]     Работа со стеком (как достать элемент из стека?) #17
Цитата Сообщение от go Посмотреть сообщение
KostyaKulakov, Вы понимаете то, что пишете? Рекомендую прибегнуть к разделу Литература C++ . Рекомендую начать с Hello, World!!! раздела.
молодой человек вам сильно давит ваша гордость

понять, что вы проиграли в этом споре, можно по моей репутацией, с помощью вас которая стала -70
go
17.03.2013, 16:55
  #18

Не по теме:

Цитата Сообщение от KostyaKulakov Посмотреть сообщение
понять, что вы проиграли в этом споре,
Признаю свое поражение и отписываюсь от этой темы. Когда последуете моему совету - можете стучать в личку. Помогу. Удачи.

easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9371 / 5421 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
18.03.2013, 01:39     Работа со стеком (как достать элемент из стека?) #19
Цитата Сообщение от KostyaKulakov Посмотреть сообщение
опять же вы используете stl, не обосновано причём. использовать итератор вектора и проверять его каждый раз, затратная операция.
Просто из любопытства: а for_each элементы коллекции по средствам колдовства перебирает, и когда остановиться по звёздам угадывает? К тому же цикл по элементам далеко не всегда с целью вывода их на экран устраивается. Их ещё и изменять приходится. Впрочем у for_each есть свои преймущества, но ограничивать набор способов организации цикла только теми, где "буковок меньше" как-то не правильно...
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
21.03.2013, 11:35     Работа со стеком (как достать элемент из стека?)
Еще ссылки по теме:

C++ Как достать объект-контейнер, а не его элемент
Удалить элемент из стека по условию и добавить элемент в начало стека C++
Работа со стеком C++

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

Или воспользуйтесь поиском по форуму:
silent_1991
21.03.2013, 11:35     Работа со стеком (как достать элемент из стека?)
  #20

Не по теме:

Цитата Сообщение от KostyaKulakov Посмотреть сообщение
опять же вы используете stl, не обосновано причём
Это вы используете stl. std::for_each - алгоритм (шаблонная функция) из stl, for по коллекции же встроен в ядро языка и обрабатывается компилятором.

Цитата Сообщение от KostyaKulakov Посмотреть сообщение
использовать итератор вектора и проверять его каждый раз, затратная операция.
1. См. комментарий easybudda.
2. А использование лямбд - не затратно? Лямбда компилятором разворачивается в обычный функтор, и на каждой итерации в for_each вызывается operator() этого функтора.

Вообще, я что-то упустил тот момент, когда использование stl стало дурным тоном. Стандартные реализации распространённых алгоритмов всегда надо предпочитать собственным велосипедам.

Yandex
Объявления
21.03.2013, 11:35     Работа со стеком (как достать элемент из стека?)
Ответ Создать тему
Опции темы

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