Вывести элементы массива с 5 по 10 в С++
Я только недавно начал изучать С++ и уменя встал такой вопрос как мне можно вывести элементы массива например с 5 по 10? Я знаю что в Python есть такой синтаксис: array[5:10:]. В С++ такого случайно нет? Подскажите пожалуйста.
Ответы (4 шт):
Вот так вот:
#include <array>
#include <iostream>
int main() {
constexpr std::array arr{1, 2, 3, 4, 5, 6, 7, 8, 9, 10};
for (decltype(arr)::size_type i = 5; i < 10; ++i) {
std::cout << arr[i] << '\n';
}
}
Вывод:
6
7
8
9
10
Также можно сделать свой класс (как в expression templates, например), где перегрузить оператор () для двух параметров, чтобы получить наиболее близкий синтаксис std::cout << my_arr(5, 10);
Самый простой способ:
int arr[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9 };
for (int i = 5; i < 10; i++) {
cout << arr[i] << endl;
} //=> 5 6 7 8 9
C++ вообще не отличается краткостью синтаксиса. Проще всего взять обычный цикл, как уже предложили в соседнем ответе: std::for (int i = 5; i < 10; i++) cout << arr[i] << endl;.
Самое близкое к тому, что вы хотите, это #include <ranges> из C++20:
#include <iostream>
#include <ranges>
#include <vector>
int main()
{
int ints[] = {0,1,2,3,4,5,6,7,8,9,10,11,12,13,14,15};
for (int x : ints | std::views::take(10) | std::views::drop(5))
std::cout << x << '\n';
}
Но тут писать даже больше, чем в обычном for...
• for c : - это цикл по всем элементам массива или чего-то еще (гуглить по названию "range-based for").
• take(10) - берет первые 10 элементов.
• drop(5) - пропускает первые 5 элементов.
Если сначала поставить drop(5), а потом take(10), то получите элементы с 5 по 15, а не с 5 по 10.
Еще один вариант: (спасибо @dIm0n)
for (int i : std::views::iota(5, 10))
std::cout << ints[i] << '\n';
Суббота не удастся, если в ответ на простой вопрос ни кто не помянет boost в купе с каким-нить функциональным алгоритмом:
#include <boost/range/adaptor/sliced.hpp>
#include <boost/range/algorithm/copy.hpp>
#include <iterator>
#include <iostream>
#include <vector>
// ...
using namespace boost::adaptors;
std::vector<int> arr{0,1,2,3,4,5,6,7,8,10,11};
boost::copy(
arr | sliced(5, 10),
std::ostream_iterator<int>(std::cout, ", "));
Подробности см. в документации.