Хабр Курсы для всех
РЕКЛАМА
Практикум, Хекслет, SkyPro, авторские курсы — собрали всех и попросили скидки. Осталось выбрать!
std::deque<std::string> list;
...
for (auto item : list)
{
printf("%s\n", items.c_str());
}
for (auto const & item: list)
view::ints и view::iota. Готовых интервалов с произвольным шагом нету.// prints numbers 1...10
for (auto i: view::ints(1, 11))
std::cout << i << std::endl;
неговоря уж о часто ненужном индексе, который в перле можно опустить, а в питоне — вынь да полож.В Python (и не только) для таких целей служит подчерк:
for _ in range(0, 10):
pass
chdir '/usr/spool/news' or die "Can't cd to spool: $!\n";
print 'ok' if chdir '/tmp';
loop(number_of_times) {
do_stuff()
}
<a href="http://perldoc.perl.org/perlvar.html#General-Variables">$_</a> — и это одна из вещей, которая превращает программу в ребус. Где эта переменная возникла? Когда исчезнет? Как меняется? Какая у неё области видимости и как это зависит от версии perl'а? Это ж просто пьесня — без работы не останетесь!echo {1..10}
#include <boost/range/irange.hpp>
void do_the_thing(int);
void oldschool(int a, int b)
{
for (auto i = a; i < b; ++i)
do_the_thing(i);
}
void ranges(int a, int b)
{
for (auto i : boost::irange(a, b))
do_the_thing(i);
}
$ g++-4.9.2 -std=c++14 -O3 -DNDEBUG -c range.cpp
$ objdump -dC range.o
range.o: формат файла elf64-x86-64
Дизассемблирование раздела .text:
0000000000000000 <oldschool(int, int)>:
0: 55 push %rbp
1: 53 push %rbx
2: 89 f5 mov %esi,%ebp
4: 89 fb mov %edi,%ebx
6: 48 83 ec 08 sub $0x8,%rsp
a: 39 f7 cmp %esi,%edi
c: 7d 10 jge 1e <oldschool(int, int)+0x1e>
e: 66 90 xchg %ax,%ax
10: 89 df mov %ebx,%edi
12: 83 c3 01 add $0x1,%ebx
15: e8 00 00 00 00 callq 1a <oldschool(int, int)+0x1a>
1a: 39 eb cmp %ebp,%ebx
1c: 75 f2 jne 10 <oldschool(int, int)+0x10>
1e: 48 83 c4 08 add $0x8,%rsp
22: 5b pop %rbx
23: 5d pop %rbp
24: c3 retq
25: 66 66 2e 0f 1f 84 00 data32 nopw %cs:0x0(%rax,%rax,1)
2c: 00 00 00 00
0000000000000030 <ranges(int, int)>:
30: 55 push %rbp
31: 53 push %rbx
32: 89 f5 mov %esi,%ebp
34: 89 fb mov %edi,%ebx
36: 48 83 ec 08 sub $0x8,%rsp
3a: 39 f7 cmp %esi,%edi
3c: 74 10 je 4e <ranges(int, int)+0x1e>
3e: 66 90 xchg %ax,%ax
40: 89 df mov %ebx,%edi
42: 83 c3 01 add $0x1,%ebx
45: e8 00 00 00 00 callq 4a <ranges(int, int)+0x1a>
4a: 39 dd cmp %ebx,%ebp
4c: 75 f2 jne 40 <ranges(int, int)+0x10>
4e: 48 83 c4 08 add $0x8,%rsp
52: 5b pop %rbx
53: 5d pop %rbp
54: c3 retq
include "generator.h"
$generator(descent)
{
// place for all variables used in the generator
int i; // our counter
// place the constructor of our generator, e.g.
// descent(int minv, int maxv) {...}
// from $emit to $stop is a body of our generator:
$emit(int) // will emit int values. Start of body of the generator.
for (i = 10; i > 0; --i)
$yield(i); // a.k.a. yield in Python,
// returns next number in [1..10], reversed.
$stop; // stop, end of sequence. End of body of the generator.
};
int main(int argc, char* argv[])
{
descent gen;
for(int n; gen(n);) // "get next" generator invocation
printf("next number is %d\n", n);
return 0;
}
/*!
* range ( container, from, to, [ step ] );
* @returns { container<T> }
*/
template <typename Container, typename Position, typename Step = uint>
static inline Container range (
Container &container,
Position from,
Position to,
Step step = 1) noexcept
{
typename std::back_insert_iterator<Container>
it = std::back_inserter(container);
do {
*it++ = from;
}
while ((from += step) <= to);
return container;
}
;
std::vector<int> vector;
for (auto value: range(vector, 1, 5)) {
std::cout << value << std::endl; // 1, 2, 3, 4, 5
}
Упрощаем for-цикл по индексам: range-based версия