【发布时间】:2013-04-11 03:03:17
【问题描述】:
我想将存储在 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。
【问题讨论】:
-
与stackoverflow.com/questions/9277906/… 几乎重复。两个真正的区别是选择的分隔符(你想要一个
\0而不是逗号),并在末尾添加额外的 nul。 -
看起来很合理(假设循环头是伪代码)。 “更优雅”? - 可能不会,因为
CString没有迭代器接口。 “更快”? - 也许你可以事先总结大小(包括两者之间的0s)并做一个适当的multiline_sz.reserve(),尽管我不会保证显着的性能改进(我猜/希望你不会垃圾邮件无论如何,注册表都有整本书)。
标签: c++ string windows stl atl