2011-04-02 83 views
6

我正在使用第三方API(準確地說是CryptEncrypt),它將C數組作爲輸入輸出參數。從邏輯上講,API歸結爲以下功能:將std :: vector傳遞給修改輸入數組的函數

void add1(int *inout, size_t length) 
{ 
    for(size_t i = 0; i < length; i++) 
    { 
    inout[i] += 1; 
    } 
} 

我試圖避免使用原始陣列,所以我的問題是我可以使用std ::向量作爲輸入上面的API?類似以下內容:

#include <vector> 
int main() 
{ 
    std::vector<int> v(10); // vector with 10 zeros 
    add1(&v[0], v.size()); // vector with 10 ones? 
} 

我可以使用'連續存儲'保證矢量向其寫入數據嗎?我傾向於認爲這沒問題(它適用於我的編譯器),但如果有人比我更懂得確認這種用法是否違反C++標準保證,我會感覺好多了。 :)

在此先感謝!

+2

std :: vector的設計目標之一是這個例子應該工作。 – Sjoerd 2011-04-02 00:42:58

+3

在新標準中,甚至有一個'v.data()'成員,所以你不必再寫'&v [0]'了,比'add1(v.data()'更清晰。 v.size());'! – Sjoerd 2011-04-02 00:44:50

+0

感謝所有的答案和評論! – 2011-04-02 01:00:19

回答

6

我可以使用矢量的「連續存儲」保證向其寫入數據嗎?

是的。

我傾向於認爲,這是確定

你的願望是正確的。

0

這應該有效。我沒有看到任何問題。

+0

你說過這個詞。 – 2011-04-02 01:03:08

3

由於它確保存儲是連續的(從2003年的標準版本開始,甚至在幾乎不可能實現明智的vector而不使用數組下的引擎)之前,應該沒問題。

2

通過標準保證存儲是連續的,但是對於空向量訪問元素[0]是標準未定義的行爲。因此,您可能會在某些編譯器中出錯。 (請參閱另一篇文章,用於在Visual Studio 2010中顯示此問題的SO.

雖然標準已在C++ 0x中解決了此問題。