Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/opengl/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 传递标准::向量<;标准::字符串>;作为C样式字符串的数组(字符**)_C++_Opengl_C++11 - Fatal编程技术网

C++ 传递标准::向量<;标准::字符串>;作为C样式字符串的数组(字符**)

C++ 传递标准::向量<;标准::字符串>;作为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

我想将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::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();
}