3

在 C++ 中,我可以将一个项目插入到向量中的任意位置,就像下面的代码一样:

std::vector<int> vec(10);
vec.insert(vec.begin()+2,2);
vec.insert(vec.begin()+4,3);

在Java中我不能这样做,我得到一个异常java.lang.ArrayIndexOutOfBoundsException,代码如下:

Vector l5 = new Vector(10);
l5.add(0, 1);
l5.add(1, "Test");
l5.add(3, "test");

这意味着 C++ 设计得更好还是只是 Java 设计决定?为什么java使用这种方法?

4

3 回答 3

8

在 C++ 代码中:

std::vector<int> vec(10);

您正在创建一个大小为 10的向量。所以从 0 到 9 的所有索引在之后都是有效的。

在 Java 代码中:

Vector l5 = new Vector(10);

您正在创建一个初始容量为 10 的向量。这意味着基础数组的大小为 10,但向量本身的大小为 0。

这并不意味着一个设计比另一个更好。API 只是不同,这并不是使一个比另一个更好的区别。

请注意,在 Java 中,现在首选使用ArrayList,它具有几乎相同的 API,但不同步。如果您想在 Java 的 Vector 中找到一个糟糕的设计决策,那么每个操作的这种同步可能就是一个。

因此,用 Java 编写等效的 C++ 初始化代码的最佳方法是:

List<Integer> list = new ArrayList<Integer>();
for (int i = 0; i < 10; i++){
    list.add(new Integer());
}
于 2013-02-27T19:47:00.487 回答
2

Vector.add(int, Object)的 Javadoc非常清楚地指出,如果索引小于零或大于或等于大小,将引发 IndexOutOfBoundsException。Vector 类型根据需要增长,您使用的构造函数设置初始容量,该容量与大小不同。请阅读链接的 Javadoc 以更好地了解如何使用 Vector 类型。此外,我们 Java 开发人员通常在 C++ 中通常使用 std::vector 的情况下使用 List 类型,例如 ArrayList。

于 2013-02-27T19:48:01.327 回答
1

差异?您无法比较两种语言是如何做到的。通常Vector会使用 Stack 数据结构或 LinkedList(或两者兼有)。这意味着,您将一个项目放在顶部,将另一个项目放在它上面,甚至另一个项目放在它上面,就像明智的做法一样。在 LinkedList 中,它有点不同,你“拉”值但同样的东西。所以在 C++ 中最好使用push_back()方法。

C++ Vector 对象是自动实例化的。但在Java中不是,你必须填写它。我不同意使用l5.add(1, "Test");. 使用l5.add("test").

既然你问了差异,你也可以用这种方式定义你的对象

 Vector a = new Vector();

那就是没有类型,在 Java 中我们称之为没有Generics. 从 Java 1.6 开始可能

Vector现在在Java中没有广泛使用。它有延迟。我们现在移动ArrayList哪个是内部List界面。

编辑

l5C++ 中广泛使用的变量名称。但是 Java 社区期望更有意义的变量名 :)

于 2013-02-27T20:12:34.820 回答