【发布时间】:2010-07-29 17:27:15
【问题描述】:
我目前正在开发一个需要尽可能少的外部依赖项的 C++ 项目,因此我非常坚持使用 STL 和 Boost。直到现在,当谈到 C++ 时,我几乎只生活在 Qt 领域。一般来说,我倾向于尽可能使用 C# 和 Python。
今天我想检查std::vector 是否包含某个项目。使用 Qt,我会这样做:
QList< int > list;
list.append( 1 );
list.append( 2 );
list.append( 3 );
if ( list.contains( 2 ) )
{
// do something
}
美观且易读。但是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
}
那(对我来说)很难读,而且过于冗长。所以我发现自己编写了一个实用函数,它接受一个向量和一个值,并根据是否找到该值返回bool。基本上,一个模板化的contains() 方法;上述std::find 调用的包装器。然后我可以以类似于 Qt 示例的方式使用它。
我想到了几个类似的实用程序函数,它们将包装其他 STL 习语,没有其他原因,只是为了提高(感知)可读性。我想知道的是……这是个坏主意吗?其他人也这样做吗?我错过了一些重要的东西吗?代码在某一时刻将是 OSS,我宁愿不做一些其他 C++ 开发人员会觉得奇怪的特殊事情。
【问题讨论】:
-
@rgrig 这对我来说仍然不如 Qt 示例可读,而且正如你所说,它不是很有效。它应该是 O(n/2),而不是 O(n)。
-
我不确定您指的是什么,因为它显然已被删除,但 O(n/2) 是 O(n)。但是,在效率方面,可以为集合/映射重载这样的包装器,以利用它们进行排序,而无需在调用站点进行任何更改。
标签: c++ stl readability