【问题标题】:Passing std::vector<std::string> as array of C-style strings (char**)将 std::vector<std::string> 作为 C 样式字符串数组 (char**) 传递
【发布时间】:2013-10-11 20:20:34
【问题描述】:

我想将 std::strings 的向量作为 C 风格的空终止字符数组 (const char**) 的数组传递给 OpenGL。

void glTransformFeedbackVaryings(GLuint program,
                                 GLsizei count,
                                 const char **varyings,
                                 GLenum bufferMode);

有可能吗?

【问题讨论】:

  • 使用 string.c_str() 转换每个字符串

标签: c++ opengl c++11


【解决方案1】:

首先使用std::string.c_str()函数将它们映射到const char*的。

std::vector<const char*> c_strs;
std::transform(std::begin(strings), std::end(strings), 
               std::back_inserter(c_strs), std::mem_fn(&std::string::c_str));

然后通过vector的.data()成员将它传递给你的函数:

glTransformFeedbackVaryings( ... , c_strs.size(), c_strs.data(), ...);

用您的其他参数替换 ...。注意:我没有编译这段代码,但应该没问题(理论上)。

如果空间对你来说真的很重要,你可以提前在向量中预留空间

c_strs.reserve(strings.size());

或在变换后使用

c_strs.shrink_to_fit();

【讨论】:

  • 为了补充您出色的总结,它将是:glTransformFeedbackVaryings (..., strings.size (), c_strs.data (), ...); count 参数是 char** 中包含的以空字符结尾的字符串的数量,这是由字符串向量。
  • 可能值得添加 c_strs.reserve(strings.size()); ?
  • 它可能是。或者之后打电话给shrink_to_fit
  • @AndonM.Coleman 谢谢。我更新了我的答案(并了解了一些有关 api 的知识:))
  • 当您的向量大小超过 4 KiB 时,它尤其有用。许多内存分配器根据请求的大小将内存块放置在不同的位置以减少碎片,如果您提前知道它将大于 4 KiB(一个非常常见的边界情况,16 KiB 是另一种情况),您可以避免通过保留适当的块大小,在内存增长时彻底重新定位。
【解决方案2】:

结构太不同了。 std::string 不仅仅包含一个指针,因此它不会直接映射到 char**。

您需要将字符串的 c_str() 值复制到新的 std::vector 中。然后你可以将这个新向量的 .data 指针传递给 OpenGL。

【讨论】:

    【解决方案3】:
    std::vector<const char*> arg( strvect.size() );
    for( std:: size_t i=0; i < arg. size(); ++i)
    {
      arg[i] = strvect[i].c_str();
    }
    

    然后使用 &arg[0]。

    【讨论】:

      【解决方案4】:
      std::vector<const char*> arr;
      for(auto&& str:vec)
        arr.push_back(str.c_str());
      
      foo(...,arr.data(),...);
      

      以上,如果vecstd::string 的向量,将使用char const** 调用foo

      char const** 将有效,而vecarr 均有效。

      如果您的 api 实际上将遵守 const 但在任意数量的位置不通过 const_cast 支持它(即,如果您有一个需要实际 char** 的旧版 API,则可以删除 const,你可以const_castdata() 拨打我怀疑的电话)。

      【讨论】:

        猜你喜欢
        • 2013-09-21
        • 2011-05-26
        • 2011-10-26
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2016-05-08
        相关资源
        最近更新 更多