c++标准库方法名称的解释

Explanation of the names of C++ std lib methods

本文关键字:解释 方法 标准 c++      更新时间:2023-10-16

我是一名Python/Scala/Haskell编码员,试图学习c++,我很难记住任何东西,因为c++中许多方法或类的名称对我来说没有任何意义。这可能是因为我不明白他们到底想做什么。你能给我解释一下吗?

  1. vector - vector是一个很奇怪的东西来称呼一个列表或序列。为什么向量?
  2. unordered_set -为什么不简单的set ?什么时候开始订购套装了?不设置隐式意味着顺序不重要,有序的版本(java的TreeSets)应该显式地称为ordered_set代替??
  3. vector.cend - cend是什么意思?我在英语词典里找不到cend。为什么不干脆结束呢?
  4. emplace -安置点是什么意思?"插入"不是更好吗?
  5. push_back -为什么不直接调用pushappend ?"后面"的部分不是隐含的吗?
  6. 为什么empty()返回布尔值?不应该是isEmpty()吗?
  7. 此外,.begin().end()似乎不一致。begin()是动词,end()是名词。Begin表示开始某事,而它只是返回一个指向start的指针。该方法不应该被称为start,这是一个名词,与"end"搭配很好,或者beginning,而不是begin
  8. 此外,list.unique根本没有做我认为它做的事情-它只是把连续的类似的项目砍掉!?!(严重违反最小惊讶原则)-有趣的是,你也可以在线性运行时正确地使用额外的哈希集

我有很多,但如果我掌握了上面的内容,我可能会更容易学习c++。谢谢!

在c++中,命名策略与其他语言有很大的不同。但正如你提到的,他们将函数命名为push_back仅仅是因为在一些容器中,如dequepush_front(它是一个双端co)ntrainer)。我们使用clear这样的函数来清空容器,而不是empty。同样,在c++中,set容器是有序的。它按平均0 (nlogn)次对元素进行排序。

  1. vector:函数式语言中也有向量,就像这个包
  2. unordered_set -无序/有序指底层实现;元素的实际存储方式
  3. vector.cendcend是指向末端的常量迭代器。常量迭代器不允许修改迭代器所指向的值。
  4. emplace - Emplace类似于insert,除了它创建了对象in-place;你传递的参数是你要传递给对象的构造函数的。
  5. push_back -这是为了维护一个统一的接口。有些容器如std::list允许push_front
  6. 为什么empty()返回布尔值?不应该是isEmpty()吗?谁说的?你习惯了Python/Scala/Haskell,但这不是唯一正确的方法。
  7. 此外,.begin().end()似乎不一致。begin()在上下文中是动词,而end()是名词。Begin表示开始某事,而它只是返回一个指向start的指针。该方法不应该被称为start,这是一个名词,与"结束"或beginning至少而不是begin:我想。这似乎是一个微不足道的抱怨。事情就是这样的。
  8. 为什么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()成员函数根据上下文返回iteratorconst_iteratorcend()函数总是返回const_iterator。这在某些情况下很有用。

emplace - emplace是什么意思?"插入"不是更好吗?

已经存在insert()成员函数,其值类型为Templace()则不同,它的参数直接传递给T类型的构造函数,而T的值是在容器的正确位置就地构造的。

push_back—为什么不直接调用push或append呢?"后面"的部分不是隐含的吗?

这可能与std::dequepush_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)时间内对双链表进行排序是可能的。)