将字符串添加到vector <set <string >>

时间:2019-05-20 22:20:10

标签: c++

感谢您抽出宝贵的时间阅读本文!我一直在网上练习,但遇到了一个我无法解决的问题。

首先,我们输入一个数字,然后输入一些名称。数字是我们放置名称的vector<string>的大小。然后,将所述vector<string>的元素复制到list<string>。 然后,该程序应该将名称复制到vector<set<string>>,其中每个 set 代表一个 team 。团队的大小由公式确定,我在计算规模时没有问题(例如,如果孩子的数量为10,而您希望将它们放置在三个团队中,则团队的大小应分别是4、3、3。)

现在这对我来说是棘手的部分。复制过程如下:

第一个输入的名称将被复制到第一个set<string>。然后,以名称中的数量为名,并重复list<string> 数量次。 (如果在某一点到达列表的末尾,则迭代器将返回列表的开头)

您停靠的名称将被放入当前设置,直到完整为止。将名称放入相应的名称集中后,然后将其从列表中删除

我不知道该怎么做。将名字放在第一个set<string>中并将其从list<string>中删除后,我立即陷入困境,我不知道如何在到达列表的开头将迭代器返回列表的开头列表的末尾,如果当前列表已满,我不知道如何跳到下一个set<string>

这是我尝试过的:

#include <iostream>
#include <vector>
#include <string>
#include <set>
#include <list>
using namespace std;
int LettersInWord(string s) { // a "letter" is an alphabetic character or a number
    int counter = 0;
    for(int i = 0; i < s.length(); i++) {
        if((s[i] >= 65 && s[i] <= 90) || (s[i] >= 97 && s[i] <= 122) ||
           (s[i] >= 48 && s[i] <= 57))
            counter++;
    }
    return counter;
}
int main() {
vector<set<string>> vss(3); // three teams
list<string> names = {{"Name1"}, {"Name2"}, {"Name3"}, {"Name4"}, {"Name5"},
                      {"Name6"}, {"Name7"}, {"Name8"}, {"Name9"}, {"Name10"}};

vector<int> size_teams = {4, 3, 3};

auto it = names.begin();
string s = *it;
vss[0].insert(*it);   // put the first name in the first set
it = names.erase(it); // erase it

int number_of_iterations = LettersInWord(s);

    int counter_of_insertions = 0; // this counter keeps track of
                                   // how many strings are inserted in a set, so
                                   // as not to overflow the size

    for(int i = 0; i < vss.size(); i++) { // iterate through the vector of sets
    int counter_of_iterations = 0;        // we compare this to counter_of_insertions
    for(auto it = names.begin(); it != names.end(); it++) { // iterate through the list

        if(it == names.end())
            it = names.begin(); // if iterator is at the end of list, return it to
                                // beginning
        counter_of_iterations = 0;
        if(counter_of_iterations == number_of_iterations) {
            vss[i].insert(*it); // insert word
            counter_of_insertions++;
            if(counter_of_insertions == size_teams[i]) i++;
            counter_of_insertions = 0;
            it = names.erase(it);
            number_of_iterations = LettersInWord(*it); // get no of letters in next word
        }
    }
}
return 0;
}

这是什么,它只是将名字复制到第一个集合中,而完全不执行其他操作。

无论我尝试什么,我都无法解决。任何人都可以对上面的代码进行修改吗?对于任何错误的措辞,错误或错误,我们深表歉意。

注意:必须使用list<string><vector<set<string>>

感谢任何愿意以任何方式提供帮助的人!

1 个答案:

答案 0 :(得分:2)

    if(counter_of_iterations == number_of_iterations) {

此行永远不会正确。

在Godbolt中很容易看到,因为有很多代码没有着色(这意味着它没有生成任何机器代码):

https://godbolt.org/z/_wm8ff

第39行也永远不会运行,因为那是for循环所在的终止情况。