【问题标题】:How to use random_shuffle with CString?如何将 random_shuffle 与 CString 一起使用?
【发布时间】:2014-11-29 07:45:30
【问题描述】:

我想洗牌 CString 变量中存在的字符。我该怎么做? Std 提供了一个名为 random_shuffle() 的函数,可用于以下列方式随机播放 std::string std::string s("ThisIsSample"); random_shuffle(s.first(),s.last()); 但是由于 CString 没有访问第一个和最后一个字符进行迭代的功能。如何将 random_shuffle 与 CString 一起使用?

【问题讨论】:

    标签: c++ cstring stdstring


    【解决方案1】:

    使用GetBuffer获取字符缓冲区,并将其边界传递给std::random_shuffle:

    void shuffle_cstring(CString& c)
    {
        size_t len = c.GetLength();
        LPTSTR buf = c.GetBuffer(1);
        std::random_shuffle(buf, buf + len);
        c.ReleaseBuffer();
    }
    

    【讨论】:

    • 您需要在完成操作后致电ReleaseBuffer。
    • 哦,你也应该先调用GetLength,并将结果存储在一个单独的变量中。因为在调用GetBuffer 和调用ReleaseBuffer 之间,您不应该调用CString 上的任何其他成员函数。
    • @BenjaminLindley 我想知道在这种情况下是否真的有必要。 MSDN 说,如果您使用GetBuffer 返回的指针来更改字符串内容,则必须在使用任何其他 CString 成员函数之前调用ReleaseBuffer。 代码确实会更改内容,但只能通过重新排列字符,因此它既不影响字符串的长度也不影响存在的字符。
    • 洗牌是一系列交换。交换是 3 个分配(1 个分配给外部字符,2 个分配给数组中的元素)。一个任务正在改变一个角色。因此,洗牌正在改变内容。你也许可以侥幸逃脱,但我不明白为什么你会不必要地破坏 API 的合同,因为知道实现以后可能会改变,可能会破坏你的代码。
    • @BenjaminLindley 我同意std::random_shuffle 正在更改缓冲区内容。然而,非常值得怀疑的是,字符洗牌会以任何方式影响GetLength,尤其是当缓冲区保持未修改时需要GetLength。
    【解决方案2】:

    转换CString to std::string:-

    CString cs("Hello");
    std::string s((LPCTSTR)cs);
    
    NOTE:- BUT: std::string cannot always construct from a LPCTSTR. i.e. the code 
    will fail for UNICODE   builds.
    

    编辑以回应评论

    由于 std::string 只能从 LPSTR / LPCSTR 构造,使用 VC++ 7.x 或更高版本的程序员可以利用 CT2CA 等转换类作为中介。

    CString cs ("Hello");
    // Convert a TCHAR string to a LPCSTR
    CT2CA pszConvertedAnsiString (cs);
    // construct a std::string using the LPCSTR input
    std::string strStd (pszConvertedAnsiString);
    

    在 s 上使用 random_shuffle 然后:-

    CString cs1(s.c_str());
    

    【讨论】:

    • 请注意,您可以使用std::basic_string<TCHAR> 在窄版本中有效地获得std::string,在Unicode 版本中有效地获得std::wstring。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-07-23
    • 1970-01-01
    • 2021-11-07
    • 2014-03-29
    • 2021-01-02
    • 2021-12-22
    相关资源
    最近更新 更多