-1

以下の構造を持つノードのリンクリストが必要でした。

    struct node
    {
     string word;
     string color;
     node *next;
    }

いくつかの理由で、リストの代わりにベクトルを使用することにしました。私の質問は、j 方向が制限され、i 方向が無制限であるベクトルを実装し、頂点の最後にさらに 2 つの文字列を追加できるかどうかです。言い換えれば、ベクトルの下の構造を実装することは可能ですか?

            j       
    i   color1  color2  …
        word1   word2   …
4

1 に答える 1

0

私は C/C++ が苦手なので、この回答はごく一般的なものにすぎません。速度やメモリの最適化に特に関心がない限り (ほとんどの場合、そうすべきではありません)、encapsulationを使用してください。

クラスを作ります。あなたがやりたいことを言うインターフェースを作ってください。それを行う方法の単純な実装を可能にします。ほとんどの場合、バグが含まれていない限り、最も単純な実装で十分です。

インターフェースから始めましょう。あなたはそれを質問の一部にすることができました。私には、文字列の配列のような 2 次元が必要なようです。1 つの次元では値 0 と 1 のみが許可され、もう 1 つの次元では非生成整数が許可されます。

誤解のないように言っておきますが、境界次元は常にサイズ 2 です (最大でも 2 ではありません)。つまり、基本的には文字列の 2×N の「長方形」について話しているのです。

どのような方法が必要ですか? 私の推測: 新しい 2×0 サイズの長方形のコンストラクター。新しい値のペアを追加するメソッド。これにより、四角形のサイズが 2×N から 2×(N+1) に増加し、2 つの新しい値が設定されます。長方形の現在の長さを返すメソッド (他の 1 つは定数であるため、無制限の寸法のみ)。また、座標によって単一の値を読み書きするための一対のランダム アクセス メソッド。それだけですか?

インターフェイスを書きましょう (すみません、私は C/C++ が苦手なので、これは C/Java/疑似コードのハイブリッドになります)。

class StringPairs {
    constructor StringPairs();  // creates an empty rectangle
    int size();  // returns the length of the unbounded dimension
    void append(string s0, string s1);  // adds two strings to the new J index
    string get(int i, int j);  // return the string at given coordinates
    void set(int i, int j, string s);  // sets the string at given coordinates
}

インデックスが範囲外の場合、関数「set」と「get」が何をするかを指定する必要があります。簡単にするために、「set」は何もせず、「get」は null を返すとしましょう。

これで質問の準備ができました。答えに行きましょう。

このクラスを作成する最速の方法は、既存の C++ クラスを 1 次元ベクトルに使用することだと思います (それが何であるか、どのように使用されるかはわかりません。そのため、存在すると仮定して、いくつかのこれを「StringVector」と呼びます)、次のようにします。

class StringPairs {
    private StringVector _vector0;
    private StringVector _vector1;
    private int _size;

    constructor StringPairs() {
        _vector0 = new StringVector();
        _vector1 = new StringVector();
        _size = 0;
    }

    int size() {
        return _size;
    }

    void append(string s0, string s1) {
        _vector0.appens(s0);
        _vector1.appens(s1);
        _size++;
    }

    string get(int i, int j) {
        if (0 == i) return _vector0.get(j);
        if (1 == i) return _vector1.get(j);
        return null;
    }

    void set(int i, int j, string s) {
        if (0 == i) _vector0.set(j, s);
        if (1 == i) _vector1.set(j, s);
    }

}

次に、この疑似コードを C++ に変換し、必要な新しいメソッドを追加します (方法は明らかです)。

既存のクラスを使用して新しいクラスを作成すると、プログラミングを高速化できます。後で気が変わった場合は、インターフェースを維持したまま実装を変更できます。

于 2013-01-10T14:42:31.127 に答える