2

sqlite3_prepare_v2()ステートメントを実行した後、それを実行する必要がありsqlite3_step()ます。

SQLITE3_ROWとりあえず、と以外のすべての戻り値を無視しましょうSQLITE3_DONE

の戻り値が である限り、sqlite3_step()すべてSQLITE3_ROWの結果を取得するまで呼び出し続ける必要があります。その場合、最後の戻り値は になりますSQLITE3_DONE

結果をstd::vectorusingに入力していますpush_back()

私が読んだことから、ベクトルの内部配列のサイズ変更により、これは O(log(n)) の平均複雑さを持つ必要があります。この複雑さを O(1) に減らすにはreserve()、実行する前にベクトルを使用する必要がありますpush_back()

しかし、sqlite3 API からは、取得する結果の合計数を返す関数を確認する前に確認できませんsqlite3_step()

sqlite3でこれを行うにはどうすればよいですか?

4

1 に答える 1

2

まず第一に、それをベンチマークしましたか? これがボトルネックですか?そうでない場合は、効率と複雑さについて心配するのをやめてくださいgoto end of answer.

まだここ?OK、それでもう 1 つ言わせてください。ベクトルのサイズ変更は複雑かもしれません。それは C++ 標準ライブラリの実装者次第です。O(1)O(n)、などの可能性がありますO(log n)。しかし、1 つ確かなことは、データベースから N 個の結果を取得した場合、 でデータを取得するつもりはないということですO(n)単純に... N 件の結果があるからです。

したがって、これについてはまだ心配する必要はないと思います-高速ですvector(かなり高品質の標準ライブラリの実装を前提としています)。それでは、そのループと要素を次々と書いてください。それだけです。whilepush_back()

しかし、貧弱な古いベクトルの遅さにまだ怖がっている場合は、クエリから返された行数を見つける方法を次に示します。これは SQLite に固有のものです。

SELECT COUNT(*) FROM the_table WHERE some_condition;

また、この質問への回答で説明されているように、さらにいくつかの可能性があります。

于 2013-07-11T13:43:40.457 に答える