c++标准库方法名称的解释
Explanation of the names of C++ std lib methods
我是一名Python/Scala/Haskell编码员,试图学习c++,我很难记住任何东西,因为c++中许多方法或类的名称对我来说没有任何意义。这可能是因为我不明白他们到底想做什么。你能给我解释一下吗?
-
vector
- vector是一个很奇怪的东西来称呼一个列表或序列。为什么向量? -
unordered_set
-为什么不简单的set
?什么时候开始订购套装了?不设置隐式意味着顺序不重要,有序的版本(java的TreeSets)应该显式地称为ordered_set
代替?? -
vector.cend
- cend是什么意思?我在英语词典里找不到cend。为什么不干脆结束呢? -
emplace
-安置点是什么意思?"插入"不是更好吗? -
push_back
-为什么不直接调用push
或append
?"后面"的部分不是隐含的吗? - 为什么
empty()
返回布尔值?不应该是isEmpty()
吗? - 此外,
.begin()
和.end()
似乎不一致。begin()
是动词,end()
是名词。Begin表示开始某事,而它只是返回一个指向start的指针。该方法不应该被称为start
,这是一个名词,与"end"搭配很好,或者beginning
,而不是begin
此外,
list.unique
根本没有做我认为它做的事情-它只是把连续的类似的项目砍掉!?!(严重违反最小惊讶原则)-有趣的是,你也可以在线性运行时正确地使用额外的哈希集我有很多,但如果我掌握了上面的内容,我可能会更容易学习c++。谢谢!
在c++中,命名策略与其他语言有很大的不同。但正如你提到的,他们将函数命名为push_back
仅仅是因为在一些容器中,如deque
有push_front
(它是一个双端co)ntrainer)。我们使用clear
这样的函数来清空容器,而不是empty
。同样,在c++中,set容器是有序的。它按平均0 (nlogn)次对元素进行排序。
-
vector
:函数式语言中也有向量,就像这个包 -
unordered_set
-无序/有序指底层实现;元素的实际存储方式 -
vector.cend
—cend
是指向末端的常量迭代器。常量迭代器不允许修改迭代器所指向的值。 -
emplace
- Emplace类似于insert,除了它创建了对象in-place;你传递的参数是你要传递给对象的构造函数的。 -
push_back
-这是为了维护一个统一的接口。有些容器如std::list允许push_front - 为什么
empty()
返回布尔值?不应该是isEmpty()
吗?谁说的?你习惯了Python/Scala/Haskell,但这不是唯一正确的方法。 - 此外,
.begin()
和.end()
似乎不一致。begin()
在上下文中是动词,而end()
是名词。Begin表示开始某事,而它只是返回一个指向start的指针。该方法不应该被称为start
,这是一个名词,与"结束"或beginning
至少而不是begin
:我想。这似乎是一个微不足道的抱怨。事情就是这样的。 - 为什么
list.unique
不返回set
?这看起来很奇怪,它不仅修改了数据结构(从函数世界来看,把数据作为副作用来改变似乎真的很奇怪),而且由于c++已经有了集合,它在这里更加奇怪。我理解unique
错了吗??如果你把没有副作用的心态带入c++,很多事情都会变得很奇怪。如果你认真学习c++,那么让你学习Python/Scala/Haskell的开放心态也应该适用于c++。list.unique
更像Ruby的Array#uniq
。来自文档:
注意,一个元素只有在与它前面的元素比较结果相等时才会从列表容器中移除。因此,这个函数对于排序列表特别有用。
如前所述,返回一个集合将丢失信息,因为在它们不是连续的情况下,它不会保留重复项。
就像我说的,如果你认真学习c++,你将不得不处理这些语言/库设计决策。在我看来,这些观点中的许多都是微不足道的抱怨。其中一些是"就是这样"。c++中的一些东西简直太疯狂了,但是如果你对c++很认真,你会怎么做呢?实际上,以Haskell为例,它似乎有一种"自然遵循"的更直接的设计,但那是一种不同的语言。希望你能熬过去
对于unique
来说,这是关于效率的;实际上应该叫compact
。它将连续相等的元素压缩成一个元素,这可以在O(n)内完成,而返回set
将是O(n log n),并且会产生构建和移动对象的成本。
vector - vector是一个很奇怪的对象列表或对象序列的称呼。为什么向量?
c++也有std::list<T>
,它是一个双重链表。我同意它可以被称为数组,但它不是固定大小的。
unordered_set -为什么不简单的一个集合?什么时候开始订购套装了?不设置隐式意味着顺序不重要和有序的版本(java的TreeSets)应该显式地调用ordered_set代替??
c++ 03已经有了std::set<T>
,它是基于搜索树的有序集合。c++ 11增加了unordered_set<T>
,它基于哈希表。有必要区分命名为set
的有序集合和新的unordered_set
。
向量。cend是什么意思?我在英语词典里找不到cend。为什么不干脆结束呢?
end()
成员函数根据上下文返回iterator
或const_iterator
。cend()
函数总是返回const_iterator
。这在某些情况下很有用。
emplace - emplace是什么意思?"插入"不是更好吗?
已经存在insert()
成员函数,其值类型为T
。emplace()
则不同,它的参数直接传递给T
类型的构造函数,而T
的值是在容器的正确位置就地构造的。
push_back—为什么不直接调用push或append呢?"后面"的部分不是隐含的吗?
这可能与std::deque
的push_front()
相同。
为什么empty()返回一个布尔值?不应该是isEmpty()吗?
c++标准库在任何地方都不使用驼峰大小写。这将违背整体风格。也没有使用is_foo()
样式。
而且,.begin()和.end()似乎不一致。Begin()是一个动词,而end()是一个名词。Begin表示开始某事,而它只是返回一个指向start的指针。这个方法不应该被命名为start吗? start是一个名词,可以用end或者begin来代替begin
我不是一个以英语为母语的人,但我相信begin和end都可以被解释为名词和动词。
为什么列表。唯一不返回集合?这看起来很奇怪,它不仅修改了数据结构(从函数世界来看,把数据作为副作用来改变似乎真的很奇怪),而且由于c++已经有了集合,它在这里更加奇怪。我是否理解错了?
用现有的非成员函数(std::unique()
)操作std::list
可能效率较低。std::list
还提供了sort()
成员函数来优化排序。(在O(n * log n)时间内对双链表进行排序是可能的。)
- 有人可以向我解释什么[](int i){返回i%2 == 0;} 方法
- 是否有任何方法可以在初始化之前更改变量的类型,您可以用示例解释
- 如何用C 中的设置类型解释该方法
- 从未解释的术语代表到Z3中的术语的任何方法
- 解释C 中三种返回类型的方法
- C++ - 重新解释此数据的最快方法
- 你能解释一下如何调用类的方法吗?
- 编译器未将指向字符串文本的良好指针解释为方法的参数
- leetcode中的最大数字:有人能解释为什么这个方法有效吗
- 谁能解释一下我对欧拉 15 项目的动态编程方法有什么问题
- 你会如何解释一个外行人或编程初学者,面向对象方法的大胆点 - 安全
- 用于解释参数的方法
- C++Visual Studio 将类方法解释为静态
- 解释 c++ 中部分最低成本方法
- 该"Named Constructor Idiom"似乎与静态方法无法访问非静态成员函数的规则相矛盾。有什么解释吗?
- 将curl结果中的字节组解释为其他数据类型的方法
- 调用返回类型不完整的方法和无法解释的模板解决方案
- c++标准库方法名称的解释
- 由于抽象模板arg的实例化,Boost::lambda表达式编译失败.任何解释和/或解决方法
- 位操作 - 解释以下C++方法