将std向量转换为char,反之亦然

时间:2015-02-27 16:59:38

标签: c++

我有一个库函数,我应该将相同的数据类型传递给主应用程序。

因此我的问题是 - 如何将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..
}

4 个答案:

答案 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);
    // ...
}