2

我想将存储在 std::vector 中的字符串列表 (ATL::CString) 写入 Windows 注册表中的 REG_MULTI_SZ 值。我知道如何在纯 C 中执行此操作(迭代一次以获得总长度,分配缓冲区,将字符串复制到由“\0”分隔的缓冲区)。

知道我使用 STL 尝试了以下操作(抱歉,我必须将 VS2010 与“for each”一起使用):

std::vector<TCHAR> multiline_sz;
for each ( CString entry in myStringList )
{
   TCHAR* buf = entry.GetBuffer();
   multiline_sz.insert(multiline_sz.end(), &buf[0], &buf[entry.GetLength()]);
   multiline_sz.push_back(L'\0');
}
multiline_sz.push_back(L'\0');

这行得通,但我想知道是否有更优雅或更快的方式使用 STL。

4

2 回答 2

2

我建议使用CString::GetString()( 而不是CString::GetBuffer()),因为它返回指向 NUL 终止字符串的指针以进行只读访问。

此外,还要注意CString::GetBuffer()需要匹配的CString::ReleaseBuffer()调用。

我也会简化你的代码,没有不必要的&buf[0],&buf[<index>]语法。

// Your pseudo code: 
// for each ( CString entry in myStringList )
{
  multiline_sz.insert(
      multiline_sz.end(), 
      entry.GetString(), // <-- current string's start
      entry.GetString() + entry.GetLength() + 1 // <-- include terminating NUL
  );
}

作为进一步的优化,您可以扫描整个输入字符串列表,并预先计算所需的长度,并在调用之前调用std::vector::reserve()以预先分配向量中的空间vector::insert()。这将在插入过程中为您节省一些重新分配和副本。


PS如果你想遍历一个std::vector<CString>带有 C++11 range-for循环,你可以使用这个语法:

for (const auto& entry : myStringList) 
于 2016-10-08T11:43:17.983 回答
1

CString::GetBuffer()已经是零终止的,所以它是有效的

for each ( CString entry in myStringList )
{
   TCHAR const* buf = entry.GetBuffer();
   multiline_sz.insert(multiline_sz.end(), &buf[0], &buf[entry.GetLength()+1]);
}
于 2013-04-18T12:26:35.257 回答