我在操作vector<T>
中使用的某些功能出现了很多,但标准接口很笨重.
例如,假设v
是vector<T>
a 的类型typename T
.理想情况下,我想打电话:
v.probe(x) //returns true if x is in v
v.sort() // sort v
v.unique() // unique elements of x
v.locate(x) // pointer to the element in v equal to x if it exists, otherwise NULL
v.cat(w) // concatenate vector w to x
v.erase(x) // erase all x’s from v
Run Code Online (Sandbox Code Playgroud)
等等.
这些都可以在stl中完成,但界面笨重且冗长.例如,v.probe(x)
会是这样的
std::find(v.begin(),v.end(),x)!=v.end()
Run Code Online (Sandbox Code Playgroud)
并且v.sort
是
std::sort(v.begin(),v.end())
Run Code Online (Sandbox Code Playgroud)
这使得std::sort
在复杂的左值表达式的情况下使用非常笨拙,需要一个临时的.(即,我不能轻易地排序foo->bar.names[3]
.
在STL中获得v的独特价值更加诡异,需要,我相信:
std::erase(std::unique(std::sort(v.begin(),v.end()).end(),v.end())
Run Code Online (Sandbox Code Playgroud)
我假设几乎每个C++程序员都遇到过这个问题或类似的问题.
围绕这个最好的方法是什么?
我考虑过3种选择:
为代码中使用的每种类型编写特殊用途vector<>
代码.
为常见的向量函数编写模板头
有一个个人vector<T>
类K<T>
,它们都是子类vector<T>
,一个mixin类algorithm_vector<T>
,我需要的算法.
选项1似乎很简单,但在一段时间后变得非常冗长.选项2并不像看起来那么简单.考虑编写一个特殊的函数探针,比如
template<typename T> probe(const vector<T> & v, const T &x)....
Run Code Online (Sandbox Code Playgroud)
好吧,问题是我们实际上只想x
通过引用传入,如果大小T
很大,否则我们想要使用值.我甚至不知道如何编写模板函数,智能地决定是否通过值或引用传递其参数,即使我这样做,也听起来很难.
选项3可能是最干净的,但具有使其不清楚的语义问题.
总之,我的问题是:在向量上添加常见的,简单的通用函数到程序的最佳方法是什么?
(另外,作为一个可能会对此有所了解的可选点,我不明白为什么STL会像搜索元素的向量或对向量进行排序等常见事情那么冗长和尴尬.是否有某些原因STL使最常见的用法如此冗长,并且在整个容器上不会超载默认值?)
我不会使用任何方法并选择使用标准算法.它们是众所周知的,任何阅读代码的程序员都会理解你要做的事情.:)
例如功能
template<typename T> probe(const vector<T> & v, const T &x)....
Run Code Online (Sandbox Code Playgroud)
只会混淆读者.当我看到标准算法时,std::find
我不需要滚动你的代码来找到函数的定义.当我看到函数探测器时,我需要滚动你的代码来找到函数定义并理解函数的作用.:)
归档时间: |
|
查看次数: |
430 次 |
最近记录: |