In the past, creating a collection of dates was a chore, because you had to individually insert them into a container (e.g. declaring a vector on one line and then pushing dates into it on subsequent lines). With features like std::initializer_list from C++11 onwards, it’s now much easier to do this concisely.
Here’s some simple, concise code to create dates without all the hassle:
struct Date
{
std::string Event;
int Year;
int Month;
int Day;
};
void print( const Date& date )
{
std::cout << date.Event << ": "<< date.Year << "/" << date.Month << "/" << date.Day << "\n";
}
void print( const std::vector<Date>& dates )
{
for ( auto date : dates )
{
print( date );
}
}
void test()
{
std::cout << "Print date:\n";
print( { "Today", 2015, 5, 5 } );
std::cout << "Print dates:\n";
print( {
{ "Christmas", 2015, 12, 25 },
{ "Spring Bank Holiday", 2016, 6, 30 }
} );
}
This style is particularly useful when writing tests – you can write a whole test, including setting up the data, on a single line (or at least, in a single function call).
Another compelling use case comes when creating test cases for graph algorithms. Suppose you have the following data structures for an undirected, weighted graph:
struct Edge
{
const size_t end1;
const size_t end2;
const size_t cost;
};
struct Graph
{
size_t source;
size_t nodes;
std::vector<Edge> edges;
};
Then creating a test graph to pass into an algorithm is as simple as:
shortest_path( { 0, 4, { {0,1,24}, {0,3,20}, {2,0,3}, {3,2,12} } })