Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 4.67/6: Рейтинг темы: голосов - 6, средняя оценка - 4.67
Котовчанин
940 / 480 / 200
Регистрация: 16.02.2010
Сообщений: 3,333
Записей в блоге: 37
1

Range-Based for для определённого диапазона

13.02.2017, 22:33. Просмотров 1202. Ответов 13
Метки нет (Все метки)

Добрый вечер, мои хорошие!

Вопросик такой... Не знаю простой или нет, но ответа не нашла.

Хочу использовать ауто для прохода по вектору, но столкнулась с проблемой. Как использовать Range-Based for не для всего вектора, а например от 1 до последнего, минуя 0 элемент? Ясное дело, что "зачем это тебе, используй старый добрый фор и итератор", это да. Но тут уже дело в интересе. Не могу заснуть, пока на найду как. Или пока не узнаю, что это невозможно.

C++
1
2
3
4
5
6
7
8
9
void run(const std::vector<int>& in)
{
 
 
    for (int i : [in.begin() + 1, in.end()])  // мои нерабочие потуги
    {   
        std::cout << " "; 
    }
}
Буду благодарна за пояснения!
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
13.02.2017, 22:33
Ответы с готовыми решениями:

Range-based for
Пример кода: int my_array = {1, 2, 3, 4, 5}; for(int &amp;x : my_array) { x *= 2; } Возникли...

Range-based for
Дана конструкция вида for(auto a:some_func()). Гарантирует ли стандарт что some_func будет вызвано...

Range-based for
Почему не работает данный цикл с динамически выделенным массивом? Подозреваю, что из-за...

загадки range-based
если поставить auto &amp;it - будет тоже самое - почему?// initializer_list::begin/end #include...

13
Эксперт С++
1587 / 917 / 777
Регистрация: 06.02.2016
Сообщений: 2,399
Записей в блоге: 29
13.02.2017, 22:41 2
Лучший ответ Сообщение было отмечено Тамика как решение

Решение

Тамика, Добрый вечер. Как вариант, можно попробовать
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <vector>
using namespace std;
int main(){
    vector<int>v{1,2,3,4,5};
    for(const auto &i:vector<int>{v.begin()+1,v.end()}){  //for(int i:vector<int>{v.begin()+1,v.end()})
        cout<<i<<" ";
    }
}
1
Котовчанин
940 / 480 / 200
Регистрация: 16.02.2010
Сообщений: 3,333
Записей в блоге: 37
13.02.2017, 22:43  [ТС] 3
Peoples, Вы спасли мой сон.) Я так поняла, Вы делаете копию вектора с нужным диапазоном и уже по ней проходите?
0
Эксперт С++
1587 / 917 / 777
Регистрация: 06.02.2016
Сообщений: 2,399
Записей в блоге: 29
13.02.2017, 22:49 4
Тамика, да, промежуточный вектор

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

Не по теме:


Цитата Сообщение от Тамика Посмотреть сообщение
Вы спасли мой сон
Спокойной ночи:D

0
-16 / 14 / 3
Регистрация: 22.01.2013
Сообщений: 154
13.02.2017, 23:22 5
C++
1
oid printVec(vector<int>& vec) {for (int a : vec){cout << a+1 << " ";}} //выводим все элементы
Добавлено через 16 минут
Возьми свою Rang -ю, кинь в лямбду-функцию, и не парься. А позиции прохода тоже залабай.
0
Don't worry, be happy
16956 / 9831 / 1895
Регистрация: 27.09.2012
Сообщений: 24,381
Записей в блоге: 2
13.02.2017, 23:29 6
Лучший ответ Сообщение было отмечено Новичок как решение

Решение

Цитата Сообщение от Тамика Посмотреть сообщение
Как использовать Range-Based for не для всего вектора, а например от 1 до последнего, минуя 0 элемент?
Упрощенная версия:
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
//g++  5.4.0
 
#include <iostream>
#include <vector>
 
 
template<typename Iterator>
class FakeRange
{
public:
    FakeRange(Iterator begin, Iterator end)
        : mBegin(begin)
        , mEnd(end)
    {
    }
    Iterator begin()
    {
        return mBegin;
    }
    
    Iterator end()
    {
        return mEnd;
    }
private:
    Iterator mBegin;
    Iterator mEnd;
};
 
 
 
template<typename Iterator>
FakeRange<Iterator> makeFakeRange(Iterator begin, Iterator end)
{
    return FakeRange<Iterator>(begin, end);
}
 
 
int main()
{
    std::vector<int> vec{1, 2, 3, 4, 5};
    for(auto e: makeFakeRange(vec.begin() + 1, vec.end())) {
        std::cout << e << " ";
    }
}
http://rextester.com/IQYIP82996
3
Котовчанин
940 / 480 / 200
Регистрация: 16.02.2010
Сообщений: 3,333
Записей в блоге: 37
14.02.2017, 10:47  [ТС] 7
Croessmah, поняла... Буду использовать полный фор DD
2
Любитель чаепитий
3524 / 1636 / 506
Регистрация: 24.08.2014
Сообщений: 5,568
Записей в блоге: 1
14.02.2017, 10:52 8
Цитата Сообщение от Croessmah Посмотреть сообщение
Упрощенная версия:
А с с++17 лучше так, ИМХО, там же range-based for переделали:
http://rextester.com/YJWXH85282
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
//g++  5.4.0
 
#include <iostream>
#include <vector>
 
 
template<typename IteratorBegin, typename IteratorEnd>
class FakeRange
{
public:
    FakeRange(IteratorBegin begin, IteratorEnd end)
        : mBegin(begin)
        , mEnd(end)
    {
    }
    IteratorBegin begin()
    {
        return mBegin;
    }
    
    IteratorEnd end()
    {
        return mEnd;
    }
private:
    IteratorBegin mBegin;
    IteratorEnd mEnd;
};
 
 
 
template<typename IteratorBegin, typename IteratorEnd>
FakeRange<IteratorBegin, IteratorEnd> makeFakeRange(IteratorBegin begin, IteratorEnd end)
{
    return FakeRange<IteratorBegin, IteratorEnd>(begin, end);
}
 
 
int main()
{
    std::vector<int> vec{1, 2, 3, 4, 5};
    for(auto e: makeFakeRange(vec.begin() + 1, vec.end())) {
        std::cout << e << " ";
    }
}
0
Форумчанин
Эксперт CЭксперт С++
8161 / 5009 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
14.02.2017, 17:49 9
Тамика, как вариант именно для вашего случая:
C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <vector>
 
int main()
{
    const std::vector<int> v = {1, 2, 3, 4, 5, 1};
    for (const auto &i : v)
        if (&i != &v.front())
            std::cout << i << " ";
}
0
hoggy
14.02.2017, 18:48
  #10

Не по теме:

ну вы и извращенцы

0
Форумчанин
Эксперт CЭксперт С++
8161 / 5009 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
14.02.2017, 19:14 11
Цитата Сообщение от hoggy Посмотреть сообщение
ну вы и извращенцы
Когда язык не поддерживает слайсы..
0
Любитель чаепитий
3524 / 1636 / 506
Регистрация: 24.08.2014
Сообщений: 5,568
Записей в блоге: 1
14.02.2017, 19:28 12
Цитата Сообщение от MrGluck Посмотреть сообщение
Когда язык не поддерживает слайсы..
Скорее когда язык - с++.
0
Форумчанин
Эксперт CЭксперт С++
8161 / 5009 / 1436
Регистрация: 29.11.2010
Сообщений: 13,455
14.02.2017, 19:37 13
Цитата Сообщение от GbaLog- Посмотреть сообщение
Скорее когда язык - с++.
Я таки надеюсь, что их потом добавят, хотя лучше пусть range v3 включат.
0
Любитель чаепитий
3524 / 1636 / 506
Регистрация: 24.08.2014
Сообщений: 5,568
Записей в блоге: 1
14.02.2017, 19:56 14
Цитата Сообщение от MrGluck Посмотреть сообщение
Я таки надеюсь
Все, кто ушёл дальше уровня Hello, world! этого ждут, я уверен! Я в их числе!
Цитата Сообщение от MrGluck Посмотреть сообщение
хотя лучше пусть range v3 включат.
Выглядит неплохо. Кое-что похоже на то, что я раньше велосипедил макросами.
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.02.2017, 19:56

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Range-based for trouble
Доброго времени суток, уважаемые форумчане! У меня возникла небольшая проблема с данной штукой....

range-based for не работает
#include &lt;iostream&gt; #include &lt;vector&gt; int main() { std::vector&lt;int&gt; v(30); for (auto z : v)...

Непонятки с range-based for!
Доброе время суток! Запутался с range-based циклами! Вообщем код inline string...

A range-based for statement
я вот чё то не понимаю - когда вызываем оператор delete для указателя на массив, он каким то...

Как это работает? (range-based for loop)
Объясните, пожалуйста, эту конструкцию: char buf = { 'a', 'b', 'c', 'd' }; for (auto it : buf)...

Вывод вложенного вектора range-based циклами
Здравствуйте, можно ли вывести vector&lt;vector&lt;int&gt;&gt; с помощью двух вложенных range-based циклов и ,...


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

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

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