我有一个库函数,我应该将相同的数据类型传递给主应用程序。
因此我的问题是 - 如何将a std::vector<char>
传递给期望char*
的C样式函数。这是我试过的
// function to apply on char
void somefunction (char* c_buf, int* c_buf_len)
// main function
typedef std::vector<char> Buf;
void (Buf& buf)
{
// first convert `buf` to char and call function
somefunction(char_buf, char_buf_len)
// Now convert buf to vector and do something with it..
}
答案 0 :(得分:2)
您无法将矢量转换为char
。他们是完全不相关的类型。好消息是你似乎需要一个指向字符缓冲区的指针,vector<char>
就是这样。通过获取第一个元素(&buf[0]
)的地址或者说buf.data()
,您可以获得指向其存储开始的指针。 buf.size()
会给你(你猜对了!)缓冲区的大小。这就是你需要致电somefunction
。
答案 1 :(得分:1)
要将std::vector<char>
传递给期望char *
的函数,您可以
1)传递向量中第一个元素的地址。唯一需要注意的是,使用此方法需要向量不为空。
if (!buf.empty())
somefunction(&buf[0], buf.size());
2)如果使用C++ 11
,请使用data()
方法作为向量。在C ++ 11中,使用data
可以保证它可以使用空向量。
somefunction(buf.data(), buf.size());
答案 2 :(得分:0)
int len = buf.size();
somefunction(&buf[0], &len);
你可以这样做,因为(来自n2798(C ++ 0x草案)):
23.2.6类模板向量[向量]
1 vector是一个支持随机访问迭代器的序列容器。另外,它支持(摊销) 最后的恒定时间插入和擦除操作;在中间插入和擦除需要线性时间。存储 管理是自动处理的,但可以提供提示以提高效率。 a的元素 向量是连续存储的,这意味着如果v是一个向量,其中T是某种类型的其他类型 对于所有0&lt; = n&lt;而不是bool,它遵循身份&amp; v [n] ==&amp; v [0] + n。 v.size() 强>
答案 3 :(得分:0)
像这样:
void (Buf& buf)
{
int len = buf.size();
somefunction(&buf[0], &len);
// ...
}