字符串中单词的反向顺序

时间:2015-02-16 22:21:15

标签: c++ list iterator

我正在努力扭转字符串中单词的顺序。例如,如果你有str1 =“天空是蓝色的”那么解决方案应该是“蓝色是天空”。

这是我的代码:

class Solution 
{
    public:
        list<string> words;

        void createList(string s)
        {
            istringstream iss(s);
            string token;

            while(getline(iss, token, ' '))
            {
                words.push_back(token);
            }
        }

        string reverseWords(string s) 
        {
            list<string>::iterator iter = words.begin();
            string newString = "";

            createList(s);
            newString.append(*iter);
            for (iter = (iter+1); iter != words.end(); iter++)
            {
                newString.append(" ");
                newString.append(*iter);
            }

            return newString;
        }
};

我的问题是...... 我正确使用列表迭代器吗?我得到了一个编译器错误,上面写着“第25行:不匹配'运算符+'”引用了reverseWords()中的for循环。

2 个答案:

答案 0 :(得分:3)

list不支持随机访问迭代器,因此不允许使用带有list的operator +,您将使用operator ++。您必须按顺序访问列表元素,就像您使用自己的链接列表实现一样。

您可以使用反向迭代器来反转字符串。

#include <list>
#include <string>
#include <iostream>
#include <sstream>

using namespace std;

class Solution 
{
    public:
        list<string> words;

        void createList(string& s)
        {
            istringstream iss(s);
            string token;

            while(getline(iss, token, ' '))
            {
                words.push_back(token);
            }
        }

        string reverseWords(string& s) 
        {
            list<string>::reverse_iterator iter = words.rbegin();
            string newString = "";

            createList(s);
            for ( ; iter != words.rend(); ++iter)
            {
                newString.append(" ");
                newString.append(*iter);
            }

            return newString;
        }
};

int main(int, char**)
{
    string in("The sky is always blue");
    Solution s;
    string out = s.reverseWords(in);

    std::cout << in << std::endl;
    std::cout << out << std::endl;
}

答案 1 :(得分:1)

这个编译很好,所以是的,因为++ iter是一个有效的语句。增量是有效的,跳跃不是:

list<string> words;

void createList(string s)
{
    istringstream iss(s);
    string token;

    while(getline(iss, token, ' '))
    {
        words.push_back(token);
    }
}

string reverseWords(string s) 
{
    list<string>::iterator iter = words.begin();
    string newString = "";

    createList(s);
    newString.append(*iter);
    ++iter;
    for (; iter != words.end(); ++iter)
    {
        newString.append(" ");
        newString.append(*iter);
    }

    return newString;
}