gpt4 book ai didi

c++ - 使用 C++/STL 将 std::vector 展平为 multi_sz 的推荐方法是什么

转载 作者:可可西里 更新时间:2023-11-01 10:07:02 26 4
gpt4 key购买 nike

我想将存储在 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 的更优雅或更快速的方法。

最佳答案

我建议使用 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 中预先分配空间,在 vector::insert() 之前电话。这会在插入过程中为您节省一些重新分配和拷贝。


P.S. 如果您想遍历 std::vector<CString>对于 C++11 range-for 循环,您可以使用以下语法:

for (const auto& entry : myStringList) 

关于c++ - 使用 C++/STL 将 std::vector<CString> 展平为 multi_sz 的推荐方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16075488/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com