Lab 13: templates, pair, and
vector
Exercise 1. swap box
I’ve placed a file SwapBox.hh
in this repo. This the
start of the definition of a template class
SwapBox<T>
that keeps track of a pair of values of
type T
. It has a get
method that always
returns the first component of that pair, and a set
method
that allows a client to set only the first value of the pair. Finally,
it has a method swap
that swaps the two elements in that
pair.
I’ve only given the class definition in this file, but I haven’t
written any of the method definitions. Write those. (Recall that,
because this is a template class, they need to be written within the
.hh
file.) You can use the file Stck_T.hh
as a
guide to the template method syntax.
The contents of a SwapBox<T>
object is a
std::pair<T,T>
object as defined in the C++ STL. It
has two components, a first
of type T
and a
second
of type T
.
I’ve also written code for a client that can be compiled with the
line
g++ -std=c++11 -o swap_int swap_int.cc
It builds an object and tests each of the methods.
Write a similar client swap_string.cc
that tests a
SwapBox<std::string>
object.
Exercise 2. odometer
I’ve included the definition of a Odometer
class in a
file Odometer.hh
. This defines an odometer object that is a
vector of digits
between 0 and base-1
. And
odometer can be reset
which sets all of its digits to
0
. It can be incremented, and that bumps the odometer up by
one. Below is a use of this class in the client
odom.cc
:
% ./odom
Enter the width of your odometer: 3
Enter its base: 2
How many times would you like to advance it?
10
Okay. Here goes...
000
001
010
011
100
101
110
111
000
001
010
Here we have a binary odometer with three bits. And then we increment
it 10 times starting at 000
. After eight “ticks” the
odometer wraps around to all 0s.
In a file named Odometer.cc
write each of the methods
for this odometer class. Since we use a
std::vector<int>
to represent the odometer, you might
find these features of vector
useful:
vector<T>(void)
: this constructor builds a vector
of size 0.
resize(int sz)
: this sets a vector to a certain
size.
size(void)
: this gives the number of components of the
vector.
at(int i)
: this accesses the i
-th
component of the vector.
for (int x: v) ...
: you can iterate over the elements
x
of a std::vector<int> v
.