CS253

CS253: Software Development with C++

Spring 2018

Begin And End

See this page as a slide show

Begin And End

Half-open interval

.begin() and .end()

vector<int> v = {11, 22, 33, 44, 55};
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    cout << *it << ' ';
11 22 33 44 55 

or:

vector<int> v = {11, 22, 33, 44, 55};
for (auto it = v.begin(); it != v.end(); ++it)
    cout << *it << ' ';
11 22 33 44 55 

++it is probably faster than it++.

const

Why does this fail?

const vector<int> v = {11, 22, 33, 44, 55};
for (vector<int>::iterator it = v.begin(); it != v.end(); ++it)
    cout << *it << ' ';
c.cc: In function 'int main()':
c.cc:2:40: error: conversion from 'std::vector<int>::const_iterator {aka 
   __gnu_cxx::__normal_iterator<const int*, std::vector<int> >}' to non-scalar 
   type 'std::vector<int>::iterator {aka __gnu_cxx::__normal_iterator<int*, 
   std::vector<int> >}' requested

const

Solution #1

One solution—use the correct type:

const vector<int> v = {11, 22, 33, 44, 55};
for (vector<int>::const_iterator it = v.begin(); it != v.end(); ++it)
    cout << *it << ' ';
11 22 33 44 55 

Solution #2

A better solution—let auto figure it out:

const vector<int> v = {11, 22, 33, 44, 55};
for (auto it = v.begin(); it != v.end(); ++it)
    cout << *it << ' ';
11 22 33 44 55 

Solution #3

The best solution—avoid all of this:

const vector<int> v = {11, 22, 33, 44, 55};
for (auto val : v)
    cout << val << ' ';
11 22 33 44 55 

.cbegin() and .cend()

.rbegin() and .rend()

vector<int> v = {11, 22, 33, 44, 55};
for (auto it = v.crbegin(); it != v.crend(); ++it)
    cout << *it << ' ';
55 44 33 22 11 

Don’t get too excited

Plain old data types:

How about old C-style data?

int a[] = {11, 22, 33, 44, 55};
for (auto it = a.begin(); it != a.end(); ++it)
    cout << *it << ' ';
c.cc: In function 'int main()':
c.cc:2:18: error: request for member 'begin' in 'a', which is of non-class type 
   'int [5]'
c.cc:2:35: error: request for member 'end' in 'a', which is of non-class type 
   'int [5]'

That failed miserably. Perhaps it’s because arrays are not objects.

Free functions

Fortunately, there exist begin() and end() free functions (not methods).

int a[] = {11, 22, 33, 44, 55};
for (auto it = begin(a); it != end(a); ++it)
    cout << *it << ' ';
11 22 33 44 55 

These work for objects, as well:

set<int> s = {11, 22, 33, 44, 55};
for (auto it = begin(s); it != end(s); ++it)
    cout << *it << ' ';
11 22 33 44 55 

What use is that? Generality for the sake of generality?

for loop

Consider any for loop:

forward_list<int> fl = {11,22,33,44,55};
for (double v : fl)
    cout << v << ' ';
11 22 33 44 55 

The compiler turns this into:

forward_list<int> fl = {11,22,33,44,55};
const auto toofar = end(fl);
for (auto it = begin(fl); it != toofar; ++it) {
    double v = *it;
    cout << v << ' ';
}
11 22 33 44 55 

Which works for any container type, even C-style arrays.

Modified: 2018-01-02T11:39

User: Guest

Check: HTML CSS
Edit History Source
Apply to CSU | Contact CSU | Disclaimer | Equal Opportunity
Colorado State University, Fort Collins, CO 80523 USA
© 2015 Colorado State University
CS Building