In which I demonstrate how boost::assign::list_of
simplifies initialization of containers.
I have previously blogged about how Uniform Initialization Simplifies Testing. In C++, you can initialize an array when defining it, but you can not initialize containers:
int a[] = {1, 2, 3}; //OK vector<int> v = {1, 2, 3}; //Not OK
You have to resort to something like this:
//Either vector<int> v; v.push_back(1); v.push_back(2); v.push_back(3); //Or int tmp[] = {1, 2, 3}; vector<int> v2(tmp, tmp+3);
In C++0X, we will have Uniform Initialization to take care of this, but if you are not on a supported compiler yet, you can use boost::assign while you are waiting:
vector<int> v3 = boost::assign::list_of(1)(2)(3);
This is, again, especially useful in testing. To translate the example from my last post from C++0X to C++98 with boost:
using boost::assign::list_of; int count_sheep(const vector<string>& animals) { return count(animals.begin(), animals.end(), "sheep"); } TEST(TestCountSheep, returns_zero_when_there_are_no_sheep) { ASSERT_EQ(0, count_sheep(list_of("pig")("cow")("giraffe"))); //here } TEST(TestCountSheep, returns_all_sheep) { ASSERT_EQ(2, count_sheep(list_of("sheep")("cow")("sheep"))); //and here }
To use boost::assign
, make sure to #include <boost/assign.hpp>
. It has other clever tricks as well, so be sure to check out the docs. Boost is a widely used collection of high quality libraries for C++, and can be downloaded here.
If you enjoyed this post, you can subscribe to my blog, or follow me on Twitter.