将CStringArray的内容复制到std :: vector

时间:2013-12-02 03:09:13

标签: c++ stl mfc

正如问题所述,我想将CStringArray的内容复制到std::vector<std::string>
有什么建议?

3 个答案:

答案 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::stringCT2A生成的字符串push_back;请注意,由于C ++ 11/14移动语义,从函数返回std::vector不是性能问题。

std::vector<std::string>