2

在我做了sqlite3_prepare_v2()一个声明之后,我需要sqlite3_step()它。

目前,让我们忽略除SQLITE3_ROWand之外的所有返回值SQLITE3_DONE

只要 is 的返回值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.

还在?好的,让我再告诉你一件事:调整向量的大小可能很复杂,这取决于 C++ 标准库的实现者。它可能是O(1), O(n), O(log n), 等等。但有一件事是肯定的:如果您从数据库中获得了 N 个结果,您将无法检索O(n). 仅仅因为您有... N 个结果。

所以我认为你仍然不应该担心这个 -vector速度很快(假设一个相当高质量的标准库实现)。所以继续写那个while循环和push_back()一个接一个的元素,就是这样。

但是,如果你仍然被糟糕的旧向量的缓慢所吓到,那么这里是你如何找到从查询返回的行数的方法——这是特定于 SQLite 的:

SELECT COUNT(*) FROM the_table WHERE some_condition;

此外,还有更多可能性,如对此问题的回答中所述。

于 2013-07-11T13:43:40.457 回答