我正在更新一些(很多)旧的 MFC 代码,以用向量替换 CArray。
有一个函数很麻烦,那就是插入函数。现有代码通过数组索引使用 InsertAt() 的地方,现在需要使用向量迭代器,这让我烦恼不已!
刚来的时候看起来没那么糟糕
array.insert(array.begin() + index, 10)
但是当真正的代码执行时...
class_instance->element_left->local_coordinate_point_array.insert(class_instance->element_left->local_coordinate_point_array.begin() + index, Point2(10,15));
您必须将所有内容输入两次,这很快就会变得烦人,这使得代码的可读性大大降低,并且如果您进行任何更改,则必须确保同时更改两者,否则您会遇到意想不到的错误......并且在大多数情况下,偏移量为零。 (我知道在数组开头插入效率不高,但插入仅在非性能关键时刻完成,并且时间关键处理是迭代数组、复制、二进制搜索等)
我可以创建一个模板函数,甚至是一个允许的宏
'InsertAt(数组,索引,10);'
但这违背了 C++ 语法,最好保持面向对象。 那么,有没有一个好的方法可以将 insert_at 函数添加到向量模板中,这样我就可以做到
array.insert_at(index, 10)
您无法向
std::vector
添加成员函数。
您可以编写免费的函数模板:
template<typename V,typename E>
void InsertAt(V& vect,const E& elem,size_t index) {
vect.insert(vect.begin()+index,elem);
}
但这违背了 C++ 语法
不。
InsertAt(vec,42,42);
是完美的 C++ 语法。
保持面向对象会更好
自由函数被视为类接口的一部分。编写这个自由函数并没有什么反 OO 的意思。相反,添加任何函数作为成员都不是干净的面向对象设计。