1

Thank you for taking your time to read this! I have been practicing online and I came across this one problem which I am not able to solve.

Firstly, we enter a number and then enter some names. The number is the size of a vector<string> where we put the names. Afterwards, the elements of the said vector<string> are to be copied to a list<string>. Afterwards, the program is supposed to copy the names to a vector<set<string>> where each set represents a team. The size of the teams is to be determined by a formula and I have no problems in calculating the sizes(for example, if the number of children is 10, and you wish to place them in three teams, then the sizes of the teams should be 4, 3, 3 respectively.)

Now here comes the tricky part for me. The copying is to be done as follows:

The first entered name is copied to the first set<string>. Afterwards, you take the number of letters in the name and iterate through the list<string> number of letters times. (If at one point you reach the end of the list, the iterator goes back to the beginning of the list)

The name you stop at is to be put into the current set until it is full. When you put the name in the corresponding set, it is then to be removed from the list.

I do not know how to do this. I get stuck right after I put the first name in the first set<string> and remove it from the list<string> I do not know how to return the iterator back at the beginning of the list if it reaches the end of the list and I do not know how to skip to the next set<string> if the current one is full.

Here is what I tried:

#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;
}

What this does is it just copies the first name to the first set and does absolutely nothing else.

Whatever I try I simply cannot fix this. Would anyone be kind to make a modification to the code above? I am sorry for any bad phrasing, mistakes or errors.

Note: It is mandatory to use list<string> and <vector<set<string>>

Thanks to anyone who is willing to help in any way!

2
  • Put up a minimal reproducible example. This will not compile as-is. Commented May 20, 2019 at 22:31
  • @TedLyngmo thanks for the suggestion, I corrected it! Commented May 20, 2019 at 22:34

1 Answer 1

2
    if(counter_of_iterations == number_of_iterations) {

This line can never be true.

It's easy to see in godbolt, because there's a huge chunk of code that doesn't get colored (meaning that it didn't have any machine code generated for it):

https://godbolt.org/z/_wm8ff

Also, line 39 can never run either, since that's the termination case for the for loop it's in.

Sign up to request clarification or add additional context in comments.

2 Comments

I seem to get the notion of what you're aiming at but I cannot process it enough to code a solution. Any hints on what should I do next? By the way, thanks a million times for answering!
honestly I don't even know what you're trying to do - you set a variable to 0 and then immediately check to see if it's essentially not zero. What do you actually want to happen? Do you want that if line I mention in my answer to be a loop instead?

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.