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} } })