const char**到std::vector的转换

本文关键字:std 转换 string vector const char | 更新日期: 2023-09-27 18:08:02

我有下面的包装器来将我的c++代码暴露给c#

extern "C" {
   LIBRARY_API void GenerateTables(
      const char* version, 
      const char* baseDir, 
      const char** fileList);
} // end extern "C"
void GenerateTables(
   const char* version,
   const char* baseDir,
   const char** fileList)
{
   std::string strVersion(version);
   std::string strBaseDir(baseDir);
   // I now need to convert my const char** to std::vector<std::string> 
   // so it can be passed to another internal method.
}

如何将我的const char** fileList转换为std:vector<std::string>。我对c++比较陌生,这里有一个明显的内存分配问题。比如

std::vector<std::string> vec;
for (int i = 0; i < fileList.length() /* length() of what!? */; i++)
    vec.push_back(/* what!? */);

我怎样才能做所需的转换,是否有更好的方法通过互操作从c#传递字符串数组(string[])到c++ ?

感谢您的宝贵时间。

const char**到std::vector<std::string>的转换

您需要为非托管代码提供某种获取长度的方法。有两种常用的方法:

  1. 传递数组的长度作为额外的参数。
  2. 使用以空结尾的数组。当你遇到一个为空的项时,数组结束。

任何一个选项都足够简单,便于您实现。这个选择完全取决于你的个人喜好。

如果你选择了第一个选项,那么你可以像这样填充向量:

std::vector<std::string> files(fileList, fileList + length);

如果你选择第二个选项,那么你将使用像这样的循环:

std::vector<std::string> files;
const char** filePtr = fileList;
while (*filePtr != nullptr)
    files.push_back(*filePtr++); 

您需要知道fileList数组的长度。一旦你知道了,你可以使用

转换fileList
size_t length = ... ;
std::vector<std::string> files( fileList, fileList + length );