使用unique_ptr的常量字符指针

时间:2018-07-16 15:30:17

标签: c++ unique-ptr c-strings char-pointer const-char

比方说,我有一个vector<string> input,我需要将其传递给带有const char**参数的函数。我的想法是像这样使用unique_ptr

const auto output = make_unique<char*>(size(input));

但是我似乎无法将const unique_ptr<const*>变成const char**。有没有办法做到这一点,或者是一个更简单的选择?

3 个答案:

答案 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;