我们可以从反向 std::string 创建 std::istringstream 对象吗

Can we create std::istringstream object from a reversed std::string

我正在使用 recommended C++ books 学习 C++。特别是,我阅读了 std::istringstream 并看到了以下示例:

std::string s("some string");
std::istringstream ss(s);
std::string word;
while(ss >> word)
{
    std::cout<<word <<" ";
}

实际输出

some string

期望输出

string some

我的问题是,我们如何使用反转字符串(包含所需输出中显示的相反顺序的单词)来创建上述 std::istringstream 对象 ss?我查看了 std::istringstream's 构造函数,但找不到一个采用迭代器的构造函数,以便我可以传递 str.back()str.begin() 而不是传递 std::string.

如果使用临时字符串,可以将迭代器间接传递给 istringstream 构造函数:

#include <sstream>
#include <iostream>

int main()
{
    std::string s{"Hello World\n"};
    std::istringstream ss({s.rbegin(),s.rend()});
    std::string word;
    while(ss >> word)
    {
        std::cout<<word <<" ";
    }
}

Output:

dlroW olleH 

尽管那是反转字符串,而不是单词。如果您想以相反的顺序打印单词,单独使用 istringstream 并没有多大帮助。你可以使用一些容器来存储提取的单词,然后反向打印它们:

#include <sstream>
#include <iostream>
#include <vector>

int main()
{
    std::string s{"Hello World\n"};
    std::istringstream ss(s);
    std::string word;
    std::vector<std::string> words;
    while(ss >> word)
    {
        words.push_back(word);
    }
    for (auto it = words.rbegin(); it != words.rend(); ++it) std::cout << *it << " ";
}

Output:

World Hello 

自从您添加了 c++20 标签:

#include <sstream>
#include <string>
#include <iostream>
#include <vector>
#include <ranges>


int main()
{
    std::vector<std::string> vec;
    std::string s("some string");
    std::string word;
    std::istringstream ss(s);

    while(ss >> word)
    {
        vec.push_back(word);
    }

    for (auto v : vec | std::views::reverse)
    {
        std::cout << v << ' ';
    }
}