2

私たちのタスクは、ファイルからテーブル スキーマに関する情報を読み取り、そのテーブルを c/c++ で実装してから、いくつかの「選択」クエリを正常に実行することです。テーブル スキーマ ファイルには、次のような内容が含まれる場合があります。

    Tablename- Student
    "ID","int(11)","NO","PRIMARY","0","".

さて、私の質問は、どのデータ構造がタスクに適しているかということです。問題は、テーブルに含まれる可能性のある列の数がわからないことです。これらの列の名前も、データ型についての考えもわかりません。たとえば、テーブルには int 型の列が 1 つだけある場合もあれば、さまざまなデータ型の列が 15 ある場合もあります。実際、スキーマ ファイルに記述されている可能性のあるテーブルの数もわかりません。

私が考えた 1 つの方法は、たとえば 20 個のベクトル (テーブル内の列の上限が 20 であると仮定) のセット数を持ち、それらのベクトルに 1stvector、2ndvector などの名前を付け、列の名前をベクトルを選択し、それに応じて使用します。しかし、そのコードは、これらすべての if/else ステートメントまたは switch case ステートメント (マッピング用) で混乱するようです。

グーグル/スタックオーバーフロー中に、実行時にクラスを記述できないことを知りました。そうしないと、問題を解決しやすくなった可能性があります。

どんな助けでも大歓迎です。ありがとう。

4

3 に答える 3

2

C++ データ構造として、std::vector< std::vector<boost::any> >. ベクトルは標準ライブラリの一部であり、要素数を動的に再スケーリングできます。ベクトルのベクトルは、任意の数の列を持つ任意の数の行を意味します。Boost.Anyは標準ライブラリの一部ではありませんが、広く利用可能で、任意の型を保存できます。

そのデータ構造に対してSQLクエリを実行するための優れたC++ライブラリを知りません。自分で書く必要があるかもしれません。たとえば、SQL コマンドはselect、適切な述語が関数オブジェクトとして渡されるwhereSTL アルゴリズムに対応します。std::find_if

于 2013-01-19T19:50:02.717 に答える
1

データ列の型に関する知識の欠如に対処するには、生の入力 (つまり、 を示唆する文字列std:string) を保存し、後で必要に応じて解釈を強制する必要があります。

これには、列名を同じ型に格納できるという利点もあります。

列の型を本当に決定したい場合は、入力の各列を投機的に解析して、それが何であるかを確認し、それに基づいて決定を下す必要があります。

いずれにせよ、入力に列区切り記号が含まれる列が含まれる可能性がある場合 (たとえば、空白で区切られたデータにスペースを含む文字列など)、入力の引用規則を知って、何らかの解析を作成する必要があります。データに取り組みます(ここでは、行全体を吸い込むのgetlineがあなたの友達です)。入力は、二重引用符で区切られた文字列でカンマで区切られているようです。

于 2013-01-19T19:58:25.710 に答える
1

std::vectorすべてのテーブル作成ステートメントを保持するために使用することをお勧めします。すべての作成ステートメントが読み込まれた後、テーブルを作成できます。

克服すべき問題は、列の種類が多すぎることです。すべての C++ コンテナーは、std::vector<std::string>. さまざまな列タイプがあります。

1 つの解決策は、データ型を単一のベースから派生させることです。これstd::vector<Base *>により、テーブルの行ごとに、ポインターが異なる {child} タイプのフィールドを指すことができるようになります。

残りはOPに任せて理解します。

于 2013-01-19T20:01:48.000 に答える