在我发表sqlite3_prepare_v2()
声明后,我需要sqlite3_step()
。
目前,我们忽略除SQLITE3_ROW
和SQLITE3_DONE
之外的所有返回值。
只要sqlite3_step()
的返回值为SQLITE3_ROW
,我就需要继续调用它,直到我得到所有结果。然后最后一个返回值为SQLITE3_DONE
。
我使用std::vector
将结果输入push_back()
。
根据我的阅读,由于向量的内部数组的大小调整,它的平均复杂度应该为O(log(n))。为了将这种复杂性降低到O(1),我需要在执行reserve()
之前使用向量的push_back()
。
但是从sqlite3 API开始,我找不到一个函数来返回我在sqlite3_step()
之前得到的结果总数。
如何使用sqlite3执行此操作?
答案 0 :(得分: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;
此外,还有一些可能性,如this question的答案所述。