gpt4 book ai didi

c++ - 在 C++ 中合并样板 vector<> 代码

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:18:48 29 4
gpt4 key购买 nike

我在处理 vector<T> 时使用了某些函数出现了很多,但标准界面很笨重。

例如,假设v如果类型是 vector<T>对于 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

等等。

这些都可以在STL中完成,但界面笨拙且罗嗦。例如,v.probe(x)会是这样的

 std::find(v.begin(),v.end(),x)!=v.end()

v.sort

std::sort(v.begin(),v.end())

这使得 std::sort在复杂的左值表达式的情况下使用起来非常尴尬,需要一个临时的。 (即,如果没有临时文件,我无法轻松地对 foo->bar.names[3] 进行排序。

在 STL 中获取 v 的唯一值更加笨拙,我认为需要:

std::erase(std::unique(std::sort(v.begin(),v.end()).end(),v.end())

我假设几乎每个 C++ 程序员都遇到过这个问题或类似的问题。

解决这个问题的最佳方法是什么?

我考虑了 3 个选项:

为每种 vector<> 编写专用代码我在代码中使用。

为常用 vector 函数编写模板头

有个人vector<T>K<T>这两个子类 vector<T>和一个 mixin 类 algorithm_vector<T>使用我需要的算法。

选项 1 看似简单,但一段时间后会变得非常冗长。选项 2 并不像看起来那么简单。考虑写一个特殊的函数探针,比如

    template<typename T> probe(const vector<T> & v, const T &x)....

嗯,问题是我们实际上只想传入 x如果大小为 T 则引用很大,否则我们要使用值(value)。我什至不知道如何编写一个模板函数来智能地决定是按值还是按引用传递其参数,即使我知道了,听起来也很难做到。

选项 3 可能是最简洁的,但存在语义问题使其不清楚。

总而言之,我的问题是:向程序中添加通用、简单的 vector 通用函数的最佳方法是什么?

(此外,作为一个可选点,它可能会揭示一些对此的一些见解,我不明白为什么 STL 使它如此冗长和尴尬地做一些常见的事情,比如搜索一个元素的 vector ,或排序一个 vector 。有没有STL 使最常见的用法如此冗长,并且不会在整个容器上重载为默认值的某种原因?)

最佳答案

我不会使用这两种方法,而是使用标准算法进行选择。他们是众所周知的,任何阅读您的代码的程序员都会理解您正在尝试做什么。:)

例如函数

template<typename T> probe(const vector<T> & v, const T &x)....

只会让读者感到困惑。当我看到标准算法 std::find 时,我不需要滚动代码来查找函数的定义。当我看到函数探针时,我需要滚动代码以找到函数定义并了解函数的作用。 :)

关于c++ - 在 C++ 中合并样板 vector<> 代码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26448459/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com