C++ STL容器

7

不同的STL容器,如vectorstacksetqueue等,支持不同的访问方法。

如果您在编写代码时使用Notepad++vim等文本编辑器,您必须不断地参考文档以查看可用的所有方法,至少我是这样做的。

有没有什么好的方法可以记住哪个容器支持哪些方法?


14
经常使用它们,你的手指将记住它们。 - Afriza N. Arief
2
在我看来,拥有良好的记忆力是程序员最重要的素质之一。@cambr - anon
你在这里具体是在寻找什么?一种可以唱出来记住东西的歌曲吗?就像其他所有东西一样,你需要通过经验来学习它。或者使用现代化的集成开发环境(IDE)。 - ryeguy
4
我不同意所有人都说你必须记住它们,那是疯狂的,因为它们实在太多了。但我同意所有人都说这个混乱中有一个系统。真的,这就是关键!一旦你理解了为什么 std::list 自带 sort() 成员函数(以及为什么 std::vector 没有,为什么 std::map 不能排序),你就不会再忘记它们有这个功能,因为这很有道理。 - sbi
或者将您的IDE更改为Eclipse CDT,它会弹出所有成员。 - user846126
记忆是好的。虽然需要很多年,但一旦你了解STL类的模式,就会变得容易。我很少使用访问STL容器的一半方式。坚持你喜欢的方法,并仅使用它。 - unixman83
8个回答

12

这些方法的名称不是为了不同而不同。它有助于记住哪些容器具有哪些方法,理解名称的含义。push_back 的例子在与集合相关时毫无意义。insert 在谈论堆栈时也没有任何意义(当然堆栈也没有前端或后端,因此它不支持push_back,只支持push)。对于向量,两者都具有明确定义的含义,因此向量同时支持insertpush_back


3
“stack”、“queue”和“priority_queue”本质上不是容器(它们是具有非常小接口的“容器适配器”) :) - UncleBens

5

使用它们足够多,以便记住每种方法。


4
如果您的记忆力总是让您失望,试着在另一个窗口中保存它们的引用。如果您有多个显示器,将这样的东西放在第二个显示器上(任何类型的文档)非常方便。

或者,我强烈推荐使用带有Intellisense的真正编程IDE!Notepad++可能对于在C++中提高生产力来说太简单了。


3

使用内置智能感知的工具,如 Windows 上的 Visual Studio 或 Linux 上的 KDevelop。

同时,也有针对 vim 和 emacs 的智能感知插件可供选择。


@Brian R. Bondy,您的意思是没有办法轻松记住这些吗?我真的不想使用Intellisense功能。 - Moeb
@cambr:如果你在那种情况下经常使用它们,你就会自动记住它们。 - Brian R. Bondy
1
当你说“我真的不想使用智能感知功能”时,我们都读到的是“我真的不想成为一个更有效率的程序员”。 - Alan
@Alan 我想你指的是 @cambr。 - Brian R. Bondy

3
即使您记得所有的“方法”,这只是故事的一部分。要有效地使用STL,您还需要了解算法。我建议阅读一本好书(Stroustrup、Josuttis等)来了解可用的内容,然后在您需要精确语法时返回到书籍或参考网站。

1

虽然它不支持记忆,但可以在vim上运行某种类型的智能感知。优点是你可以从自己和外部源代码文件中创建标签。无论如何,STL需要一种特殊的处理方式,这里进行了描述。

下载这些vim-scripts OmniCppCompleteSuperTab

安装OmniCppComplete:

  • 将插件解压到~/.vim目录下。

安装SuperTab:

  • 以vim打开文件($ vim supertab.vba)。
  • 执行文件(:so %)。

通过您喜欢的软件包管理器安装ctags。下载并解压缩这个file文件,然后在上面运行ctags。

$ ctags -R --c++-kinds=+p --fields=+iaS --extra=+q --language-force=C++ tags_stl cpp_src 

这将生成一个名为“tags_stl”的ctags文件,其中包含STL-Tags。将其复制到任何您喜欢的位置。将以下行添加到您的~/.vimrc中(如果不存在):

set tags+=~/path/to/your/tags_stl  
filetype on  
filetype plugin on  
let OmniCpp_GlobalScopeSearch=1  
let OmniCpp_NamespaceSearch=2  
let OmniCpp_MayCompleteDot=1  
let OmniCpp_MayCompleteArrow=1  
let OmniCpp_MayCompleteScope=1  
let OmniCpp_DisplayMode=1  
let OmniCpp_DefaultNamespaces=["std"]

即使在使用命名空间std时,这也涵盖了关于'tab'、'.'、'::'和'->'的STL语句。如果你不喜欢品红色,请不要这样做。


1

这可能不完全符合您的需求,但是“Effective C++”的作者Scott Meyers根据Nicolai Josuttis的书《C++标准库》编制了以下STL算法清单:

Josuttis的STL算法概述


1

了解它们是什么,以及常见的方法,然后应该很容易记住哪些适用。STL并不完全一致,但它还是相当不错的。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接