使用<set>运算符调用void函数时出错

时间:2018-10-22 00:15:33

标签: c++

我正在尝试将字符串空集传递给我的函数。然后,我想在我的main中调用该函数并打印出集合中的所有元素。

这是我的功能代码:

#include<iostream>
using std::cout; using std::endl;
#include<algorithm>
using std::set_union; using std::copy;
#include<iterator>
using std::inserter; using std::ostream_iterator;
#include<string>
using std::string;
#include<set>
using std::set;

void removing(const string &word, set<string> &result) {
    string del_word = word;
    char erased_l;

    for(int i = 0; i < del_word.length(); i++) {
        erased_l = word[i];
        del_word.erase(0, 1);
        del_word = erased_l + del_word;
    }
}

下面是我调用函数的主要代码:

int main (){
    set<string> jump = {};

    set<string> del = removing("axiom", jump);
    for (string ele:del) {
        cout << ele << endl;
    }
 }

我收到以下错误:

No viable conversion from 'void' to 'set<std::__1::string>' (aka 'set<basic_string<char, char_traits<char>, allocator<char> > >')

错误在第16行:

    set<string> del = removing("axiom", jump);

我的代码正在尝试完成: 如果我传入公理,那么我希望将我的字符串设置为{xiom,aiom,axom,axim,axio}。因此,删除第一个字母,保留其余单词。然后删除第二个字母,保留其余单词,等等...

1 个答案:

答案 0 :(得分:1)

主要问题包括:

  1. 无法将void函数的返回值分配给set,因此会导致编译器错误。您的设计是将对空结果set的引用传递到removing函数中,并用结果数据填充它,因此您可以在此处删除分配。

  2. result函数中的removing中没有添加任何内容,因此该函数以空开头,并在函数调用后结束为空。

这是一个有效的版本:

void removing(const string &word, set<string> &result) {
    for (int i = 0; i < word.length(); i++) {
        result.insert(word.substr(0, i) + word.substr(i + 1, word.length()));
    }
}

int main () {
    set<string> jump = {};
    removing("axiom", jump);

    for (string ele : jump) {
        cout << ele << endl;
    }
}

输出:

aiom
axim
axio
axom
xiom

话虽如此,我仍然不清楚为什么result应该是函数的参数。如果您仅打算使用它来存储此特定结果,那么从调用者的角度来看,这种设计似乎更加简洁:

set<string> removing(const string &word) {
    set<string> result;

    for (int i = 0; i < word.length(); i++) {
        result.insert(word.substr(0, i) + word.substr(i + 1, word.length()));
    }

    return result;
}

int main () {
    set<string> jump = removing("axiom");

    for (string ele : jump) {
        cout << ele << endl;
    }
}

Try it!