比方说,我有一个vector<string> input
,我需要将其传递给带有const char**
参数的函数。我的想法是像这样使用unique_ptr
:
const auto output = make_unique<char*>(size(input));
但是我似乎无法将const unique_ptr<const*>
变成const char**
。有没有办法做到这一点,或者是一个更简单的选择?
答案 0 :(得分:3)
我只需构建一个指向字符串c_str()
的指针的矢量,然后获得一个指向该字符串的指针。
std:vector<const char*> pointers;
pointers.reserve(input.size());
for (const auto& e : input)
pointers.push_back(e.c_str()); // get const char *'s
auto argument = pointers.data(); // get pointer to const char*'s - const char**
或使用unique_ptr
auto pointers = std::make_unique<const char*[]>(size(input))
for (size_t i = 0; i < input.size(); ++i)
pointers[i]= input[i].c_str(); // get const char *'s
auto argument = pointers.get(); // get pointer to const char*'s - const char**
答案 1 :(得分:3)
我认为您需要使用它来适应您无法控制的某些接口,否则我会考虑修改有问题的接口以避免不必要的临时数据创建,只是为了适应不合适的接口……
由于您只需要一个已知大小的临时数组,所以最简单的解决方案可能是分配一个指针数组,并用指向向量中字符串的指针填充它:
auto pointers = std::make_unique<const char*[]>(size(v));
std::transform(begin(v), end(v), &pointers[0], [](const auto& s) { return s.c_str(); });
此数组也可以放在堆栈上,以避免动态内存分配。但是,由于您在这里使用字符串并且愿意将数据复制到临时数组中,因此我认为性能并不重要,因此我认为不需要增加复杂性……
答案 2 :(得分:1)
两种方法,具体取决于c接口是否需要null终止:
procedure WriteString(const s: UnicodeString);
var
utf: UTF8String;
len: integer;
begin
utf := UTF8String(s);
len := Length(utf);
BlockWrite(fil, len, sizeof(len));
BlockWrite(fil, PAnsiChar(utf)^, len);
end;
function ReadString: UnicodeString;
var
len: integer;
utf: UTF8String;
begin
BlockRead(fil, len, sizeof(len));
SetLength(utf, len);
BlockRead(fil, PAnsiChar(utf)^, len);
Result := UnicodeString(utf);
end;