使用装饰者让std::vector支持连续赋值

使用Qt的容器时总是让人省心,不仅是它同时提供了C++ Style和Java Style的操作接口,并且还支持下面这样的连续赋值方式:

QVector vec;vec << 7 << 3 << 9 << 3 << 2 << 1 << 6 << 8;而std::vector时显然就没有这么贴心了,,对于不同且没规律的赋值,循环都不好用,只好一个个地push_back();

不过好在,我们可以用装饰类为std::vector添加这个功能:

template<typename T>class VectorDecorator{public:VectorDecorator(std::vector<T>& in) : m_vec(in) {}inline VectorDecorator& operator<< (const T &t){ m_vec.push_back(t); return *this; }private:std::vector<T>& m_vec;};我们在这个装饰类中定义了私有成员是std::vector<T>类型的一个引用,它需要在初始化列表中被赋值。

然后重载 operator<<,调用push_back实际添加数据,返回自身以继续接受之后的"<<"。

这样我们就拥有了一个简易的装饰者,就使用起来也很方便,写段测试代码看看:

vector<int> pre;VectorDecorator<int>(pre) << 7 << 3 << 9 << 3 << 2 << 1 << 6 << 8;for ( size_t i = 0; i < pre.size(); ++i ){cout << pre.at(i) << " ";}cout << endl;有时候,我们还想让std::vector使用 "<<" 添加另一个std::vector,可以给装饰类再添段代码:template<typename T>class VectorDecorator{public:VectorDecorator(std::vector<T>& in) : m_vec(in) {}inline VectorDecorator& operator<< (const T &t){ m_vec.push_back(t); return *this; }inline VectorDecorator& operator<< (const std::vector<T> &l){ m_vec.insert(m_vec.end(), l.begin(), l.end()); return *this; }private:std::vector<T>& m_vec;};然后我们就可以像这样子使用std::vector了<( ̄︶ ̄)>: vector<int> pre;vector<int> in;VectorDecorator<int>(pre) << 7 << 4 << 9 << 3 << 2 << 1 << 6 << 8;VectorDecorator<int>(in) << 10 << 12 << pre << 16 << 18;for ( size_t i = 0; i < in.size(); ++i ){cout << in.at(i) << " ";}cout << endl;

版权声明:本文为博主原创文章,未经博主允许不得转载。

代替你主持夕阳的葬礼。

使用装饰者让std::vector支持连续赋值

相关文章:

你感兴趣的文章:

标签云: