2013-07-11 12 views
1

在我做了sqlite3_prepare_v2()的一個聲明之後,我需要sqlite3_step()吧。sqlite3_step和結果數

目前,我們忽略除SQLITE3_ROWSQLITE3_DONE之外的所有返回值。

只要sqlite3_step()的返回值是SQLITE3_ROW,我需要繼續調用它,直到我得到所有結果。那麼最後的返回值將是SQLITE3_DONE

我正在使用push_back()將我的結果輸入std::vector

從我讀過的,這應該有平均複雜度爲O(log(n))由於矢量的內部數組的大小調整。爲了將這種複雜性降低到O(1),我需要使用矢量的reserve(),然後再做push_back()

但是,然後從sqlite3 API,我看不到一個函數,返回結果的總數,我會得到它之前,我sqlite3_step()它。

我該怎麼用sqlite3做到這一點?

回答

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的答案中所述,還有幾種可能性。

+0

不,這不是瓶頸,做一個'SELECT COUNT'和一個'reserve()'可能比只用'push_back()'而不用'reserve()'要慢。我正在使用GNU STL。 – ruben2020

+0

我只是想知道是否有一種廉價的方法來找出結果的數量,以便我可以做我的微型優化,但是如果'SELECT COUNT'是唯一的方法,那麼這對我的目的來說太貴了,因爲它會做另一個SQL查詢的編譯。是的,我知道沒有必要在不必要的地方過度優化。 – ruben2020

+0

@ ruben2020非常好。然後,你跳轉到'goto'指令:) – 2013-07-11 17:03:55