为了可读性而包装STL习语是一个好主意吗?

Luc*_*cas 11 c++ stl readability

我目前正在开发一个需要尽可能少的外部依赖项的C++项目,因此我非常关注STL和Boost.到目前为止,在C++方面,我几乎完全生活在Qt-land.一般来说,我倾向于使用C#和Python.

今天我想检查是否std::vector包含某个项目.有了Qt,我会这样做:

QList< int > list;
list.append( 1 );
list.append( 2 );
list.append( 3 );

if ( list.contains( 2 ) )
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

很好,可读.但std::vector没有contains方法,这是一个惊喜.好的...这样的STL成语是什么?搜索周围,似乎是这样的:

std::vector< int > list;
list.push_back( 1 );
list.push_back( 2 );
list.push_back( 3 );

std::vector< int >::const_iterator result =
    std::find( list.begin(), list.end(), 2 );

if ( result != list.end() )
{
    // do something
}
Run Code Online (Sandbox Code Playgroud)

那(对我来说)难以理解,而且太冗长了.所以我发现自己编写了一个实用函数,它接受一个向量和一个值,并bool根据是否找到值返回.基本上,模板化的contains()方法; 上述std::find调用的包装器.然后,我可以以类似于Qt示例的方式使用它.

我有几个类似的实用函数,它们可以包装其他STL惯用语,而不是其他原因,但可读性增加(感知).我想知道的是......这是一个坏主意吗?其他人也这样做吗?我错过了一些关键的东西吗 代码将在某一时刻成为OSS,而我宁愿做一些其他C++开发人员会觉得奇怪的特殊事物.

bra*_*ing 9

提升使它更整洁.我再也不会使用基于STL迭代器的算法了.基于范围的算法是一种更整洁的抽象,可以产生更清晰的代码.

#include <boost/range/algorithm/find.hpp>

void foo(){
    std::vector<int> list;
    ...
    ...
    boost::find(list, 2) != list.end()
}
Run Code Online (Sandbox Code Playgroud)


Kir*_*sky 6

编写有助于您的实用程序功能并使代码更清晰是没有错的.其他人也这样做.Boost库是这类实用程序函数和类的最大集合.

更多的说C++标准明确建议扩展标准库(17.3.1.2/1):

该库可以通过C++程序进行扩展.每个条款(如果适用)描述了此类扩展必须满足的要求.此类扩展通常是以下之一:

  • 模板参数
  • 派生类
  • 满足接口约定的容器,迭代器和/或算法