如何从矢量转换为常量数组
How to convert from vector to const array
我有一个函数的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**
不是"常量指针到指针到字符",而是"指针到常量指针到字符",如果要确保该函数不会更改外部指针内容,则必须添加另一个const
。 const 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);
但无论哪种方式,以上方法都有效。
- C++常量数组的编译时间较长
- 从另一个静态常量数组初始化静态常量数组(只需少量计算)
- 使用双指针传递 2D 常量数组
- 检查输入 std::array 指针数据是否等于某个常量数组
- 如何在可执行文件中存储常量数组?
- 常量数组如何在每个元素中只能包含字符,而 char* 数组能够指向每个元素中的字符串?
- LLVM 无法将数组类型强制转换为常量数组
- 如何在C++中的单行中返回常量数组中的值
- C++ 具有常量数组和initializer_list的重载构造函数
- 在可变参数构造函数中初始化常量数组
- 非常量数组
- C/C++ 中的常量数组和静态常量数组有什么区别
- C++全局常量数组:是否保证合并(优化)到一个副本中
- 在常量数组上使用指针遍历
- 具有函数指针常量数组的 C++ 模板化静态类
- 字符常量数组为空,即使已为其赋值 [C++]
- 指向常量数组的指针
- 函数指针的常量数组令人困惑
- 在 c++ 中初始化静态常量数组
- 常量数组类成员初始化