如何从矢量转换为常量数组

How to convert from vector to const array

本文关键字:常量 数组 转换      更新时间:2023-10-16

我有一个函数的API,比如:

void func (const char** s,const size_t* ss);

即,该函数获取以空结尾的字符串 [ s ] 及其大小 [ ss ] 的常量数组。我在运行时获取字符串,但不知道它们的数量。我想做的是定义vector<char*> vS - 将字符串插入其中并定义vector<size_t> vSS - 插入字符串大小。最终我应该将vector<char*> vS转移到const char**vector<size_t> vSS const size_t*.我知道存在一个技巧&vS[0]/&vSS[0].问题是上述分别生成char**size_t* ss我错过了康斯特。如何解决这个问题?

如果您能够修复 API 以使其正确,请将其更改为:

void func (const char* const* s,const size_t* ss);

否则,如果您不需要通过向量修改字符串内容,则将向量更改为:

vector<const char*> vS;

否则,您需要执行const_cast并信任 API 不会修改任何内容:

func(const_cast<const char**>(&vS[0]), &vSS[0]);

(如果您有兴趣,将char**传递给采用const char**的函数的问题在于该函数可以修改其中一个指针以指向const char。然后,调用方将有一个指向该const对象的非常量指针,没有任何内容可以阻止他尝试修改它。繁荣!未定义的行为。

如果你将参数传递给函数(而不是试图在参数中传递结果),那么非常量不是问题:你可以在任何需要cont char *的地方使用char *

但是您在双指针方面有问题 - const char ** 等。它们不会隐式转换,因为它可能导致 const 冲突。您可以在C++常见问题解答中阅读说明。

在您的情况下,您可以创建一个 vector<const char*> ,正如@aschepler所说。

顺便说一句,const char**不是"常量指针到指针到字符",而是"指针到常量指针到字符",如果要确保该函数不会更改外部指针内容,则必须添加另一个constconst char * const *char const * const * ,这是相同的 - 指向常量指针的 const 指针指向常量字符。

(顺便说一句,在处理多个常量时,从右到左阅读 relly 会有所帮助:尝试使用上一段中的最后一个表达式。是的,您可以在此表达式的末尾添加另一个const以获取"const 指针到const 指针到const char")。

只需将vS声明为

vector<const char*> vS;

那么&vS[0]const char**了. size_t*可以隐式转换为const size_t*.

(顺便说一句,func可能应该是

void func(const char* const* s, const size_t* ss);

但无论哪种方式,以上方法都有效。