Не понимаю почему string subscript out of range

// Cтроки
// Дано предложение. Вывести слова, начинающиеся на гласную букву.

#include <iostream>
#include <string>
using namespace std;

int main()
{
    setlocale(0, "");
    string str= "Еще одна зима ау";
    string letters= "ёуеыаоэяиюЁУЕЫАОЭЯИЮ";
    int len = 20;
    int dlina = size(str);
    int *arr = new int[dlina] {}; // массив пробелов
    int temp = 1;
    int j = 1;
    int g = 0;
    int d = 0;
    arr[0] = 0;

    for (int i = 0; str[i]; i++) // поиск 1 букв слова
    {
        if (str[i] == ' ')
        {
            temp++;
            if (j < temp)
            {
                arr[j] = i+1;
            }
            j++;
        }
    }

    cout << "Предложение: " << str;
    cout << endl;
    cout << "Слова начинающиеся на гласную букву: ";

    for (int i = 0; i < dlina; i++) // Вывод слов
    {
        for (int j = 0; j < len; j++)
        {
            if (str[arr[i]] == letters[j])
            {
                while (str[d] != ' '&& d<dlina)
                {
                    cout << str[g];
                    g++;
                }
                d++;
                cout << ' ';
            }
        }
    }

    return 0;
}

Ответы (2 шт):

Автор решения: AR Hovsepyan

Легкий способ:

std::stringstream stream(str);
std::string s;
while (stream >> s )
    if (letters.find(s[0]) != string::npos)
        std::cout << s << '\n';

Способ быстрый:

size_t first = str.find_first_not_of(' '),
    second = first + 1;
while (second != string::npos) {
    second = str.find_first_of(' ', first );
    if (letters.find(str[first]) != string::npos)
        cout << str.substr(first, second) << '\n';
    first = str.find_first_not_of(' ', second + 1);
}
→ Ссылка
Автор решения: Remlexlo

Смог решить проблему сам

// Cтроки
// Дано предложение. Вывести слова, начинающиеся на гласную букву.

#include <iostream>
#include <string>
using namespace std;

int main()
{
    setlocale(0, "");
    string str= "Еще одна зима уф";
    string letters= "ёуеыаоэяиюЁУЕЫАОЭЯИЮ";
    int len = 20;
    int dlina = size(str);
    int *arr = new int[dlina] {}; // массив индексов 1 букв слова
    int temp = 1;
    int j = 1;
    int d = 0;
    arr[0] = 0;

    for (int i = 0; str[i]; i++) // поиск 1 букв слова
    {
        if (str[i] == ' ')
        {
            temp++;
            if (j < temp)
            {
                arr[j] = i+1;
            }
            j++;
        }
    }

    cout << "Предложение: " << str;
    cout << endl;
    cout << "Слова начинающиеся на гласную букву: ";

    for (int i = 0; i < j; i++) // Вывод слов
    {
        for (int q = 0; q < len; q++)
        {
            if (str[arr[i]] == letters[q])
            {
                d = arr[i];
                while (str[d] != ' ' && d < dlina)
                {
                    cout << str[d];
                    d++;
                }   

                cout << ' ';
            }
        }
    }

    return 0;
}
→ Ссылка