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.
A nice example… How can i assign a vector of objects
Say you have a class ‘Stuff’:
class Stuff
{
public:
Stuff(int i, double d){}
};
Then you can make a vector like this:
std::vector stuffs = list_of(Stuff(1, 1.0))(Stuff(2, 2.0));
But note that almost all recent compilers have support for real initializer lists now, so check out if your compiler supports it before starting to use boost.
thank you… that works..