-6

我是一名 Python/Scala/Haskell 编码器,正在尝试学习 C++,但我很难记住任何东西,因为 C++ 中的许多方法或类的名称对我来说没有任何意义。这可能是因为我不明白他们实际上打算做什么。谁能帮我解释一下:

  1. vector- 将向量称为列表或事物序列是一件很奇怪的事情。为什么是矢量?
  2. unordered_set- 为什么不简单地一个set?从什么时候开始订购套装?不隐含地设置意味着顺序无关紧要,而应该显式调用有序版本(java的TreeSets)ordered_set
  3. vector.cend- cend 是什么意思?我在英文字典里找不到cend?为什么不简单地称之为结束呢?
  4. emplace- 安置是什么意思?一个更好的词不应该是“插入”吗?
  5. push_back- 为什么不简单地调用pushor append?“后退”部分不是隐含的吗?
  6. 为什么empty()返回一个布尔值?不应该isEmpty()吗?
  7. 此外,.begin()and.end()似乎不一致。begin()是动词,而end()在这种情况下是名词。begin 表示开始某事,而它只是返回一个开始的指针。不应该调用start作为名词并且与“end”配合得很好的方法,或者beginning至少而不是begin
  8. 此外,list.unique根本不像我认为的那样做 - 它只是连续相似物品的印章!?!(严重违反最小惊讶原则)-有趣的是,您也可以使用额外的哈希集在线性运行时正确地做到唯一

我还有很多,但如果我了解以上内容,我可能会更轻松地学习 C++。谢谢!

4

4 回答 4

2

在 C++ 中,命名策略与其他语言完全不同。但是正如您所提到的,他们命名该函数push_back只是因为在某些容器中,例如dequehas push_front(它是一个双端约束器)。我们使用诸如clear清空容器之类的功能而不是empty. 此外,在 C++ 中,集合容器是有序的。它以平均 O(nlogn) 次对元素进行排序。

于 2013-03-17T11:01:54.507 回答
1
  1. vector: 函数式语言中也有向量,比如这个包
  2. unordered_set- Unordered/ordered 指的是底层实现;元素的实际存储方式。
  3. vector.cend-cend是一个指向末尾的常量迭代器。常量迭代器不允许您修改迭代器指向的值。
  4. emplace- Emplace 类似于插入,只是它“就地”创建对象;您将要传递给对象的构造函数的参数设置为 emplace。
  5. push_back- 这是为了保持统一的界面。像 std::list 这样的一些容器可以让你 push_front
  6. 为什么empty()返回一个布尔值?不应该isEmpty()吗?:应该吗?谁说的?你已经习惯了 Python/Scala/Haskell,但这并不是真正的方法。
  7. 此外,.begin()and.end()似乎不一致。begin()是动词,而end()在这种情况下是名词。begin 表示开始某事,而它只是返回一个开始的指针。不应该调用该方法,start它是一个名词并且与“end”配合得很好,或者beginning至少不是begin:我想。这似乎是一个小小的抱怨。就是这样。
  8. 为什么不list.unique返回一个set?看起来很奇怪,它不仅修改了数据结构(来自功能世界,将数据变异作为副作用似乎真的很奇怪),而且这里更奇怪,因为 C++ 已经有了集合。我理解unique错了吗??:如果你把没有副作用的心态带到 C++ 中,很多事情会很奇怪。如果你认真学习 C++,那么让你学习 Python/Scala/Haskell 的开放思想也应该适用于 C++。list.unique更像是 Ruby 的Array#uniq. 从文档中:

请注意,只有当一个元素与它之前的元素比较相等时,它才会从列表容器中删除。因此,此函数对于排序列表特别有用。

如前所述,返回一个集合会丢失信息,因为在它们不连续的情况下它不会保留重复项。

就像我说的,如果你认真学习 C++,你将不得不处理其中一些语言/库设计决策。其中许多观点对我来说似乎都是小问题。其中一些是“就是这样”。C++ 中的某些东西简直是疯狂的,但如果你对 C++ 很认真,你会怎么做?事实上,例如 Haskell 似乎有一个“自然遵循”的更直接的设计,但这是一种不同的语言。希望你能克服这个。

于 2013-03-17T11:07:50.630 回答
1

特别是,它与效率有关unique;它实际上应该被称为compact. 它将连续相等的元素压缩为单个元素,这可以在 O(n) 中完成,而返回 aset将是 O(n log n),并且会产生构造和移动对象的成本。

于 2013-03-17T11:14:29.040 回答
1

向量 - 向量是一个很奇怪的东西,可以称为列表或事物序列。为什么是矢量?

C++ 也有std::list<T>一个双向链表。我有点同意它可以称为数组,但它又不是固定大小。

unordered_set - 为什么不只是一个集合?从什么时候开始订购套装?不设置隐含意味着顺序无关紧要,有序版本(java的TreeSets)应该显式调用ordered_set?

C++03 已经有了std::set<T>基于搜索树的有序集。C++11 添加了unordered_set<T>基于哈希表的 . 需要区分有序集合 namedset和 new unordered_set

vector.cend - cend 是什么意思?我在英文字典里找不到cend?为什么不简单地称之为结束呢?

end()成员函数返回iteratorconst_iterator取决于上下文。该cend()函数总是返回const_iterator。这在某些情况下很有用。

emplace - emplace 是什么意思?一个更好的词不应该是“插入”吗?

已有insert()成员函数采用 type 的值Templace()不同的是,它的参数直接传递给T类型的构造函数,并且T值在容器中的正确位置就地构造。

push_back - 为什么不简单地调用 push 或 append?“后退”部分不是隐含的吗?

这很可能与std::deque's平价push_front()

为什么 empty() 返回一个布尔值?不应该是 isEmpty() 吗?

C++ 标准库在任何地方都不使用驼峰式大小写。这会违反整体风格。它也没有使用这种is_foo()风格。

此外, .begin() 和 .end() 似乎不一致。在这种情况下,begin() 是动词,而 end() 是名词。begin 表示开始某事,而它只是返回一个开始的指针。该方法不应该被称为 start 这是一个名词并且与“end”很相配,或者至少开始而不是 begin

我不是以英语为母语的人,但我相信 begin 和 end 都可以解释为名词和动词。

为什么 list.unique 不返回一个集合?看起来很奇怪,它不仅修改了数据结构(来自功能世界,将数据变异作为副作用似乎真的很奇怪),而且这里更奇怪,因为 C++ 已经有了集合。我理解独特的错误吗?

std::list使用现有的非成员函数 ( ) 进行操作std::unique()可能会降低效率。std::list还提供了sort()成员函数来优化排序。(可以在 O(n * log n) 时间内对双向链表进行排序。)

于 2013-03-17T11:17:39.933 回答