gpt4 book ai didi

java - C++ STL 数据结构与 Java 的比较

转载 作者:可可西里 更新时间:2023-11-01 16:26:13 24 4
gpt4 key购买 nike

我目前正在学习 C++ 并试图适应它附带的标准数据结构,但它们看起来都很简单。例如,list 没有我在 Java 中习惯使用的像 get(index) 这样的简单访问器。 pop_back 和 pop_front 等方法也不返回列表中的对象。所以你必须做类似的事情:

Object blah = myList.back();
myList.pop_back();

而不是像这样简单的东西:对象 blah = myList.pop_back();

在 Java 中,几乎每个数据结构都会返回对象,因此您不必进行这些额外的调用。为什么 C++ 的 STL 容器是这样设计的?我在 Java 中做的像这样的常见操作对于 C++ 不是很常见吗?

编辑:抱歉,我想我的问题措辞很差,无法获得所有这些否决票,但肯定有人可以编辑它。澄清一下,我想知道为什么与 Java 相比,STL 数据结构是这样创建的。还是我一开始就使用了错误的数据结构集?我的观点是,这些看起来像是您可能在(在我的示例中)列表上使用的常见操作,而且肯定每个人都不想每次都编写自己的实现。

编辑:将问题改写得更清楚。

最佳答案

很多人已经回答了您提出的具体问题,所以我将尝试从更大的角度来看一下。

Java 和 C++ 之间必须有的根本区别之一是 C++ 主要处理值,而 Java 主要处理引用。

例如,如果我有这样的东西:

class X {
// ...
};

// ...
X x;

在 Java 中,x 只是对 X 类型对象的引用。要有一个 X 类型的实际对象,它才能引用,我通常有这样的东西:X x = new X;。但是,在 C++ 中,X x; 本身定义了 X 类型的对象,而不仅仅是对对象的引用。我们可以直接使用该对象,而不是通过引用(即伪装的指针)。

虽然这最初看起来可能是一个相当微不足道的差异,但其影响是巨大而普遍的。一个影响(在这种情况下可能是最重要的)是在 Java 中,返回一个值根本涉及复制对象本身。它只涉及复制对值的引用。这通常被认为非常便宜并且(可能更重要)完全安全——它永远不会抛出异常。

在 C++ 中,您直接处理值。当您返回一个对象时,您不仅返回了对现有对象的引用,还返回了该对象的值,通常以该对象状态拷贝的形式返回。当然,如果您愿意,也可以返回一个引用(或指针),但要实现这一点,您必须明确说明。

标准容器(如果有的话)甚至更倾向于使用值而不是引用。当您向集合添加一个值时,添加的是您传递的值的拷贝,而当您取回某些内容时,您将获得容器本身中的值的拷贝。

除其他外,这意味着虽然返回一个值可能像在 Java 中一样便宜且安全,但它也可能很昂贵和/或抛出异常。如果程序员想要存储指针,他/她当然可以这样做——但该语言不像 Java 那样要求它。由于返回一个对象可能是昂贵的和/或抛出,标准库中的容器通常是围绕确保它们在复制昂贵的情况下能够合理地工作而构建的,并且(更多重要的是)即使在/如果复制引发异常时也能正常工作。

这种设计上的基本差异不仅可以解释您所指出的差异,还可以解释更多其他差异。

关于java - C++ STL 数据结构与 Java 的比较,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13128651/

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