C++ 传递标准::向量<;标准::字符串>;作为C样式字符串的数组(字符**)
我想将std::strings向量作为C样式的空终止字符数组(constchar**)的数组传递给OpenGLC++ 传递标准::向量<;标准::字符串>;作为C样式字符串的数组(字符**),c++,opengl,c++11,C++,Opengl,C++11,我想将std::strings向量作为C样式的空终止字符数组(constchar**)的数组传递给OpenGL 可能吗?结构太不一样了。字符串包含的不仅仅是指针,所以它不会直接映射到char** 您需要将字符串的c_str()值复制到新的std::vector中。然后可以将新向量的.data指针传递到OpenGL。首先使用std::string的.c_str()函数将它们映射到const char* std::vector<const char*> c_strs; std::tran
可能吗?结构太不一样了。字符串包含的不仅仅是指针,所以它不会直接映射到char**
您需要将字符串的c_str()值复制到新的std::vector中。然后可以将新向量的.data指针传递到OpenGL。首先使用
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));
用其他参数替换。注意:我还没有编译这段代码,但是(理论上)应该可以
如果空间对您来说真的很重要,您可以使用
c_strs.reserve(strings.size());
或者在转换后使用
c_strs.shrink_to_fit();
std::向量arr;
用于(自动(&str:vec)
arr.push_back(str.c_str());
foo(…,arr.data(),…);
如果上面的vec
是std::string
的向量,则将使用char const**
调用foo
此char const**
将有效,而vec
和arr
均有效
如果您的api实际上将遵守const
,但在任何数量的点上都不支持const\u cast
(即,如果您有一个需要实际char**
的遗留api,您可以const\u cast
调用我怀疑的数据()
。std::vector arg(strvect.size());
对于(std::size_t i=0;i
然后使用&arg[0]。使用string.c_str()转换每个字符串以补充您的优秀摘要,它将是:
glTransformFeedbackVaryings(…,strings.size(),c_strs.data(),…)
count参数是字符**
中包含的以空结尾的字符串的数量,这是由字符串向量的大小给出的。可能值得添加c_strs.reserve(strings.size());?可能是这样。或者在之后调用shrink_to_fit
。@AndonM.Coleman谢谢。我更新了我的答案(并了解了一些有关api的知识:))当向量的大小超过4kib时,这尤其好。许多内存分配器根据请求的大小将内存块放置在不同的位置,以减少碎片,如果您提前知道它将>4kib(一种非常常见的边界情况,16kib是另一种情况)通过保留适当的块大小,可以避免在内存增长时彻底重新定位内存。
c_strs.reserve(strings.size());
c_strs.shrink_to_fit();
std::vector<const char*> arr;
for(auto&& str:vec)
arr.push_back(str.c_str());
foo(...,arr.data(),...);
std::vector<const char*> arg( strvect.size() );
for( std:: size_t i=0; i < arg. size(); ++i)
{
arg[i] = strvect[i].c_str();
}