2011-04-02 42 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中解决了此问题。