C ++ Text приключенческая игра — начертите слова в верхнем регистре

По сути, я следую этому уроку: http://cplussplussatplay.blogspot.com.cy/2012/11/text-adventure-games-c-part-1.html

Я понял все до сих пор, кроме этого:

// Make words upper case
// Right here is where the functions from cctype are used
for(i = 0; i < words.size(); i++)
{
for(j = 0; j < words.at(i).size(); j++)
{
if(islower(words.at(i).at(j)))
{
words.at(i).at(j) = toupper(words.at(i).at(j));
}
}
}

На данный момент у нас есть вектор слов, который полон символов.
Я не понимаю необходимости двух для циклов, ни этого words.at (i) .at (j)).
Это 2D вектор или что-то?

Заранее спасибо.

РЕДАКТИРОВАТЬ: Спасибо всем большое за вашу помощь! Я понял это сейчас! Это первый раз, когда используется Stack Overflow, и я до сих пор люблю его! 🙂

Еще одна вещь, другой вопрос возник!

string sub_str;
vector words;
char search = ' ';// Clear out any blanks
// I work backwords through the vectors here as a cheat not to       invalidate the iterator
for(i = words.size() - 1; i > 0; i--)
{
if(words.at(i) == "")
{
words.erase(words.begin() + i);
}

1. Что означает второй комментарий?

2. Как могут быть пробелы в векторе? Первые петли в соответствии с создателем очищает любые пробелы.
Это код ранее:

for(i = 0; i < Cmd.size(); i++)
{
if(Cmd.at(i) != search)
{
sub_str.insert(sub_str.end(), Cmd.at(i));
}
if(i == Cmd.size() - 1)
{
words.push_back(sub_str);
sub_str.clear();
}
if(Cmd.at(i) == search)
{
words.push_back(sub_str);
sub_str.clear();
}
}

Еще раз спасибо!

0

Решение

Я добавлю комментарии, чтобы пройтись по коду:

// Make words upper case
// Right here is where the functions from cctype are used
for(i = 0; i < words.size(); i++) // for each word in the vector "words"{
for(j = 0; j < words.at(i).size(); j++) // for each character in the word "words[i]"{
if(islower(words.at(i).at(j)))      // if the character is lower case...
{
words.at(i).at(j) = toupper(words.at(i).at(j)); // ...make upper case
}
}
}

Таким образом, внешний цикл повторяется по каждому слову, а затем внутренний цикл повторяется по каждому символу текущего слова и изменяет его на верхний регистр, если это символ нижнего регистра.

Я полагаю, что несколько эффективнее использовать строку для изменения характера, как:

words.at(i).at(i) -= 32; // ...make upper case

Который не требует вызова функции: прыгать, толкать и выдвигать машинные инструкции для вызова toupper(), Просто разрешите немедленную адресацию внутри одной и той же функции (и, следовательно, стекового фрейма).

2

Другие решения

i является индексом определенного слова. j это индекс определенного символа.
Алгоритм перебирает каждый char слова, а затем обрабатывает следующее слово.

1

Первый цикл итерации через ваш word вектор (от первого слова до последнего в позиции word.size - 1) затем второй цикл проходит через все слово charaters. Если персонаж на позиции j слова в положении i в нижнем регистре, а затем в верхнем регистре

1