在C++中加入样板矢量<>代码

kdo*_*dog 4 c++ stl c++11

我在操作vector<T>中使用的某些功能出现了很多,但标准接口很笨重.

例如,假设vvector<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使最常见的用法如此冗长,并且在整个容器上不会超载默认值?)

Vla*_*cow 5

我不会使用任何方法并选择使用标准算法.它们是众所周知的,任何阅读代码的程序员都会理解你要做的事情.:)

例如功能

template<typename T> probe(const vector<T> & v, const T &x)....
Run Code Online (Sandbox Code Playgroud)

只会混淆读者.当我看到标准算法时,std::find我不需要滚动你的代码来找到函数的定义.当我看到函数探测器时,我需要滚动你的代码来找到函数定义并理解函数的作用.:)