【问题标题】:how copy from one stringstream object to another in C++?如何在 C++ 中从一个字符串流对象复制到另一个?
【发布时间】:2010-08-09 17:24:58
【问题描述】:

我有std::stringstream 对象ss1。现在,我想从这个副本创建另一个副本。

我试试这个:

std::stringstream ss2 = ss1;

或:

std::stringstream ss2(ss1)

都不行

错误信息是这样的:

std::ios::basic_ios(const std::ios &) 无法从 bsl::basic_stringstream, bsl::allocator>::basic_stringstream(const bsl::basic_stringstream, bsl::allocator>&).

【问题讨论】:

    标签: c++ stringstream


    【解决方案1】:

    确实,流是不可复制的(尽管它们是可移动的)。

    根据您的使用情况,以下方法效果很好:

    #include <iostream>
    #include <sstream>
    
    int main()
    {
        std::stringstream ss1;
        ss1 << "some " << 123 << " stuff" << std::flush;
    
        std::stringstream ss2;
        ss2 << ss1.rdbuf(); // copy everything inside ss1's buffer to ss2's buffer
    
        std::cout << ss1.str() << std::endl;
        std::cout << ss2.str() << std::endl;
    }
    

    输出:

    大约 123 个东西
    大约 123 个东西

    【讨论】:

    • 这是否比 Pedro d'Aquino 的回答更有效,因为它似乎更直接。
    • @alfC:你必须分析才能看到,但只是猜测这可能更有效,因为它直接从一个缓冲区复制到另一个缓冲区,并且不会在中间动态分配字符串。
    • (现在我向下滚动查看另一个答案中的评论。抱歉重复的问题)
    • 注意:这不适用于 ostringstream / wostringstream,因为 rdbuf() 是读取操作。对于o 流,你仍然需要 str() 。
    • @GManNickG 这不只是一个副本 - 而是取决于(rdbuf)的实现,一个举动?表示 ss2 现在有数据而 ss1 没有?
    【解决方案2】:

    作为 std::stringstream does not provide 复制构造函数,您必须从 std::string ss1outputs 构建它:

    std::stringstream ss2(ss1.str());
    

    【讨论】:

    • 我能看到的唯一问题是它强制ss1 咳出一个字符串,然后将其重新插入ss2rdbuf 直接做就行了。
    • 同意。我认为这个解决方案的效率不如上面那个,因为它需要分配一个字符串和两个副本。
    猜你喜欢
    • 2022-11-30
    • 2013-04-14
    • 1970-01-01
    • 2012-05-09
    • 2017-05-27
    • 2012-03-05
    • 1970-01-01
    • 1970-01-01
    • 2021-08-28
    相关资源
    最近更新 更多