【问题标题】:How to convert from vector to const array如何从向量转换为常量数组
【发布时间】:2013-01-23 13:55:49
【问题描述】:

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

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

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

【问题讨论】:

  • API 如何知道s 中有多少个字符串以及ss 中有多少个大小?
  • 它得到了额外的参数计数,这说明了。问题主题并不重要==>没有添加那个

标签: c++ pointers vector constants


【解决方案1】:

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

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

否则,如果不需要通过vector修改字符串内容,那么将vector改为:

vector<const char*> vS;

否则,您需要发送const_cast 并相信 API 不会修改任何内容:

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

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

【讨论】:

    【解决方案2】:

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

    但是双指针有问题 - const char ** 等。它们不会被隐式转换,因为它可能导致 const 违规。你可以阅读C++ FAQ Light的解释。

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

    顺便说一句,const char** 不是“指向 char 的指针的 const 指针”,而是“指向指向 char 的 const 指针的指针”,如果你想确保函数不会改变外部,则必须添加另一个 const指针内容。 const char * const *char const * const *,它们是相同的 - 指向 const 的指针指向 const 字符。

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

    【讨论】:

      【解决方案3】:

      只需将vS 声明为

      vector<const char*> vS;
      

      那么&amp;vS[0] 就是const char**。而size_t* 可以隐式转换为const size_t*

      (顺便说一句,func应该是

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

      但以上任何一种方式都可以。)

      【讨论】:

      • 双 const 不是多余的吗? (在 const char* const* s)
      • @Rookie:否:第一个阻止修改字符串内容,第二个阻止修改指向字符串的指针。
      猜你喜欢
      • 2021-10-22
      • 2011-02-24
      • 1970-01-01
      • 2011-02-16
      • 1970-01-01
      • 1970-01-01
      • 2021-12-26
      相关资源
      最近更新 更多