Exercise 16.1:
instantiation: class or function generated by the compiler from a template.
Exercise 16.4:
#include
using std::vector;
#include
using std::begin; using std::end;
#include
using std::list;
#include
using std::string;
template
input_iterator find(input_iterator first, input_iterator last, const T &val) { while (first != last) { if (*first == val) { return first; } ++first; } return last; } int main(void) { int iarr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9}; vector
ivec(begin(iarr), end(iarr)); vector
::iterator iresult = find(ivec.begin(), ivec.end(), 6); string sarr[] = {"zero", "one", "two", "three", "four", "five", "six", "seven", "eight", "nine"}; list
slist(begin(sarr), end(sarr)); list
::iterator sresult = find(slist.begin(), slist.end(), "six"); return 0; }
Exercise 16.5:
#include
#include
using std::string;
template
void print(const T (&arr)[N])
{
std::cout << N << " elements in array: " <
Exercise 16.6:
#include
// the compiler will use the size of the literals to
// instantiate a version of the template with the sizes
// substituted for N
template
T *begin(T (&arr)[N])
{
return arr;
}
template
T *end(T (&arr)[N])
{
return arr + N;
}
int main(void)
{
int iarr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
for (int *beg = begin(iarr); beg != end(iarr); ++beg)
{
std::cout << *beg << std::endl;
}
return 0;
}
Exercise 16.7:
#include
template
constexpr unsigned size(const T (&arr)[N])
{
return N;
}
int main(void)
{
int iarr[] = {0, 1, 2, 3, 4, 5, 6, 7, 8, 9};
std::cout << size(iarr) << std::endl;
return 0;
}
Exercise 16.8:
As we've seen, only a few library types, vector and string being among them, have the subscript operator. Similarly, all of the library containers have iterators that define the == and != operators. Most of those iterators do not have the < operator. By routinely using iterator and !=, we don't have to worry about the precise type of container we're processing.