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で不適切な設計上の決定を見つけたい場合は、すべての操作でのこの同期はおそらく1つでした。

したがって、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 型は必要に応じて大きくなり、使用したコンストラクターはサイズとは異なる初期容量を設定します。Vector 型の使用方法をよりよく理解するには、リンクされた Javadoc をお読みください。また、Java 開発者は通常、C++ で通常 std::vector を使用する状況で ArrayList などの List 型を使用します。

于 2013-02-27T19:48:01.327 に答える
1

違いは?2つの言語がそれらをどのように行うかを比較することはできません. 通常Vector、Stack データ構造または LinkedList (または両方) を使用します。つまり、1 つのアイテムを上に置き、別のアイテムをその上に置き、さらに別のアイテムをその上に置くということです。LinkedList では少し異なります。値を「プル」しますが、同じことです。したがって、C++ ではpush_back()メソッドを使用することをお勧めします。

C++ Vector オブジェクトは自動的にインスタンス化されます。しかし、Java ではそうではありません。記入する必要があります。を使用して埋める方法には同意しませんl5.add(1, "Test");。を使用しl5.add("test")ます。

違いを尋ねたので、この方法でもオブジェクトを定義できます

 Vector a = new Vector();

それは型なしで、Java ではそれを without と呼びますGenerics。Java 1.6 以降で可能

Vector は現在、Java で広く使用されていません。遅延があります。ArrayListここで、どちらが内部Listインターフェイスであるかに移動します。

編集

などの変数名l5は、C++ で広く使用されています。しかし、Java コミュニティはより意味のある変数名を期待しています :)

于 2013-02-27T20:12:34.820 に答える