0

ツールのリストを選択するクエリ ステートメントがあります。これらのツールは 2D ベクトルに配置する必要があります。最初のレベルはそのカテゴリで、2 番目のレベルはカテゴリの「バケット」です。

struct Tool {};
typedef boost::shared_ptr< Tool > ToolPtr;
typedef std::vector< ToolPtr > ToolVec;
typedef std::vector< ToolVec > ToolCategory;

クエリ ステートメントは次のようになります。

const QString getTools =
"SELECT tool_id, category_id, category_name, tool_name FROM tool_relation "
"WHERE course_id = ? ORDER BY category_id ASC, tool_id ASC";

q.bindValue(0, courseID);
q.exec();

while (q.next())
{

}

これを 1 つのクエリ ステートメントで実行したいのですが、考えられる唯一の方法は、正しいバケットへの一時的なポインターを使用し、すべてのレコードをテストして、カテゴリ ID が変化するかどうかを確認することです。効率が悪いようです。

編集:このようなものは、クエリステートメントを1つだけ使用するときに思いついたものです。

ToolVector *curBucket = 0;

int curCategory = 0;

while (q.next())
{
    if (q.value(1).toInt() != curCategory)
    {
        curCategory = q.value(1).toInt();

        ToolVec toolVec;

        curBucket = &toolVec;

        categories.push_back(toolVec);
    }

    ToolPtr toolPtr(new Tool(
                        q.value(0).toInt(),
                        q.value(2).toString()));

    curBucket->push_back(toolPtr);
}
4

1 に答える 1

1

「効率」の定義が違うのかもしれません。私にとっては、速度とメモリの要件です。if2 つの SELECT ステートメントを処理すると、返される行ごとにステートメントを使用する場合でも、1 つのステートメントを処理するよりも常に遅くなり、消費量も多くなります。

しかし、私はあなたのロジックについて何も知りませんが、ツール バケットをどのように探しているのかが少しわかりません。category_idどこにも保存されずcategory_name、構造体の中にのみ保存されますTool。すべてのツールを反復しない限り、バケットを見つけることはできません。バケツはmapどうですか?また、効率要件を満たす場合もあります。

typedef std::map< int, ToolVec > ToolCategory;

while (q.next())
{
  curCategory = q.value(1).toInt();
  ...      
  categories[curCategory].push_back(toolPtr);
}
于 2012-10-10T08:27:43.163 に答える