我目前正在开发一个需要尽可能少的外部依赖项的 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
}
(对我而言)这很难读,而且过于冗长。所以我发现自己编写了一个实用函数,它接受一个 vector 和一个值,并根据是否找到该值返回 bool
。基本上,一个模板化的 contains()
方法;上述 std::find
调用的包装器。然后我可以以类似于 Qt 示例的方式使用它。
我有几个类似的实用函数,它们会包装其他 STL 习语,除了(感知到的)可读性增加外,没有其他原因。我想知道的是……这是个坏主意吗?其他人也这样做吗?我错过了一些重要的东西吗?代码在某一时刻将是 OSS,我宁愿不做一些其他 C++ 开发人员会觉得奇怪的特殊事情。
最佳答案
boost 使它更整洁。我从不使用STL 不再基于迭代器的算法。范围 基于算法是一个更简洁的抽象 并产生更简洁的代码。
#include <boost/range/algorithm/find.hpp>
void foo(){
std::vector<int> list;
...
...
boost::find(list, 2) != list.end()
}
关于c++ - 包装 STL 习惯用法以提高可读性是个好主意吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/3365340/