正如问题所述,我想将CStringArray
的内容复制到std::vector<std::string>
。
有什么建议?
答案 0 :(得分:5)
因为CStringArray也是在线性数组中分配的,所以不需要循环。 只需使用insert函数并定义CStringArray的开始和结束元素!
typedef std::basic_string<TCHAR> tstring;
int _tmain(int argc, TCHAR* argv[])
{
CStringArray array;
array.Add(_T("Test1"));
array.Add(_T("Test2"));
array.Add(_T("Test3"));
array.Add(_T("Test4"));
vector<tstring> vec;
vec.insert(vec.begin(),&array[0],&array[array.GetSize()-1]+1);
return 0;
}
答案 1 :(得分:1)
#include <string>
#include <vector>
#if defined(UNICODE) || defined(_UNICODE)
typedef std::wstring string;
#else
typedef std::string string;
#endif
typedef std::vector<string> StringVector;
void CmfcstrarDlg::OnBnClickedButton1()
{
CStringArray strs;
strs.Add(_T("one"));
strs.Add(_T("two"));
strs.Add(_T("three"));
StringVector copy;
for (int n = 0; n < strs.GetCount(); n++)
{
const CString& s = strs.GetAt(n);
copy.push_back(string(s));
}
StringVector::const_iterator citer = copy.cbegin();
for (; citer != copy.cend(); citer++)
{
OutputDebugString(citer->c_str());
OutputDebugString(_T("\n"));
}
}
答案 2 :(得分:1)
CStringArray
包含CString
个。在Unicode版本中(自VS2005以来一直是默认版本,应该考虑用于现代C ++ Windows软件),CString
存储 Unicode UTF-16 字符串。
相反,std::vector<std::string>
包含std::string
,它可以存储ANSI或MBCS字符串,或UTF-8字符串,但不是 Unicode UTF-16字符串。
因此,要正确执行此转换,您必须先考虑如何从CString
转换为std::string
。
一个选项可以是CT2A
conversion helper(或CW2A
,如果你只考虑Unicode构建,CString
存储始终是UTF-16字符串)。
但请注意,从Unicode(CString
)到“ANSI”的转换可能是有损的。无损转换可以是从UTF-16到UTF-8(从Unicode UTF-16转换为Unicode UTF-8字符串,可以使用带有CW2A
转换标志的CP_UTF8
无论如何,假设您可以接受CT2A
执行的默认转换,您可以考虑以下简单代码:只需遍历CStringArray
,将当前CString
转换为{ {1}}使用std::string
和CT2A
生成的字符串push_back
;请注意,由于C ++ 11/14移动语义,从函数返回std::vector
不是性能问题。
std::vector<std::string>