Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677

Запутался с индексами

10.06.2016, 22:33. Показов 1069. Ответов 8
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Привет, немного запутался в своем же коде (который работает на ура).

Создал функцию, которая разделяет текст на слова и возвращает вектор этих слов. Она берет в аргументы сам тект, делиметры (которыми разделяются слова) и максимальный размер слова, которое может быть записано в вектор.

Вот она:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
std::vector<std::string> tokenize(const std::string & text, const std::string & delim, int maxWordSize = std::numeric_limits<int>::max())
{
    std::vector<std::string> words;
 
    auto last = 0;
 
    for (auto i = 0; i < text.size(); i++)
    {
            if (std::find(delim.begin(), delim.end(), text[i]) != delim.end())
            {
                std::cout << last << " ";    // DEBUG
                std::cout << i << "\n";      // DEBUG
 
                std::string word { text.begin() + last, text.begin() + i };
 
                if (word.size() <= maxWordSize) words.push_back(word);
 
                while (std::find(delim.begin(), delim.end(), text[i]) != delim.end()) i++;
 
                last = i;
            }
    }
 
    return words;
 
}
Так вот, когда я её делал, я в пэйте рисовал "план", как она будет работать, считал индексы там всякие и т.п. И я думал, что когда в for-цикле будет находится делиметр, то переменная i этого цикла будет стоять на индексе этого делиметра. Так вот, рассмотрим, например, кусок текста "Короче, это тест". Если мы посчитаем индексы от буквы К до ,, то получится, что запятая имеет индекс 6, а условие внутри цикла выполнится.

Далее, я в цикле пихаю в вектор слов слово текста от last (0 для первого слова), до i (я даже в консоли это вывожу). Получается, что в вектор помещается "Короче,". Да, с запятой, ведь её индекс - 6, что вывелось в консоли.

НО НЕТ, в вектор слов было помещено "Короче" без запятой. Это как понимать? Я считать разучился или конструктор, который я использую для std::string word { text.begin() + last, text.begin() + i }; в строке 14 как-то по-другому работает? Копирует от last до i не включительно? Помогите
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
10.06.2016, 22:33
Ответы с готовыми решениями:

Построчно отсортировать отдельно элементы с чётными индексами по убыванию, с нечётными индексами - по возрастанию
Дан двумерный массив. Значения элементов ввести с клавиатуры. Построчно отсортировать отдельно элементы с чётными индексами по убыванию, и...

Определить, делится ли сумма элементов массива с чётными индексами на сумму элементов с нечётными индексами
Привет Ребята! помогите с решением! в долгу не останусь) задано натуральное число n и массив и n целых чисел a0,a1,...,an-1. Написать...

В двумерном массиве заменить элементы строк с четными индексами элементами строк с нечетными индексами
Дан массив чисел, А (5, 4). Превратить массив , заменив элементы строк с четными индексами элементами строк с нечетными индексами (элементы...

8
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
10.06.2016, 22:34  [ТС]
Вот картиночка классная
Миниатюры
Запутался с индексами  
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
10.06.2016, 23:22
meJevin, В STL принято, что end указывает на элемент за последним.
0
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
11.06.2016, 00:06  [ТС]
avgoor, то есть в записи std::string word { text.begin() + last, text.begin() + i }; я говорю конструктору, чтобы он скопировал в word все из text от last до i НЕ включительно ?

Добавлено через 51 секунду
Ну, символы с индексами (в случае, который я описывал) 0 1 2 3 4 5
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
11.06.2016, 00:22
Лучший ответ Сообщение было отмечено meJevin как решение

Решение

meJevin,
C++
1
2
std::vector<int> vec;
std::copy(vec.begin(), vec.end(), <...>);
Вектор - пустой т.е. begin()==end(),

Пусть теперь std::vector<int> vec(1);
end()==begin()+1 - скопируется только нулевой элемент.

Добавлено через 2 минуты
Сделано так потому, что не всегда можно сказать какой итератор "больше". А вот равны ли они - всегда. Ну и цикл выгдядит так: for(auto it = vec.begin(); it != vec.end(); ++it)
1
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
11.06.2016, 00:51
Цитата Сообщение от meJevin Посмотреть сообщение
Запутался с индексами
Тогда реализуйте без индексов
http://en.cppreference.com/w/c... d_first_of
1
 Аватар для meJevin
161 / 153 / 92
Регистрация: 18.11.2015
Сообщений: 677
11.06.2016, 01:38  [ТС]
Nosey, а я про неё и забыл. Спасибо)

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
std::vector<std::string> tokenize(const std::string & text, const std::string & delim, int maxWordSize = std::numeric_limits<int>::max())
{
    std::vector<std::string> words;
 
    auto last = text.find_first_not_of(delim), found = text.find_first_of(delim);
 
    do {
        std::string word{ text.begin() + last, text.begin() + found };
 
        if (word.size() <= maxWordSize) words.push_back(word);
 
        last = text.find_first_not_of(delim, found);
 
        found = text.find_first_of(delim, last);
 
    } while (found != std::string::npos);
 
    return words;
 
}
Я там не из алгоритма, правда, использовал

Добавлено через 6 минут
avgoor, спасибо, теперь все понятно.
0
 Аватар для avgoor
1550 / 877 / 179
Регистрация: 05.12.2015
Сообщений: 2,555
11.06.2016, 01:58
Цитата Сообщение от meJevin Посмотреть сообщение
Я там не из алгоритма
Пофиг. Во всем STL принято соглашение, что диапазон задается как [begin, end), т.е. конец в диапазон не включается.
0
 Аватар для Nosey
1379 / 406 / 144
Регистрация: 22.10.2014
Сообщений: 872
11.06.2016, 13:13
Цитата Сообщение от meJevin Посмотреть сообщение
Я там не из алгоритма, правда, использовал
Немного зря, ведь с ней вы могли реализовать обобщенную функцию, что есть приятный бонус
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
template<typename T, typename D>
std::vector<T> tokenize(const T& text, const D& delim)
{
    std::vector<T> words;
 
    auto beg = std::begin(text);
    decltype(beg) cur;
 
    while ((cur = std::find_first_of(beg, std::end(text), std::begin(delim),
            std::end(delim))) != std::end(text))
    {
        words.emplace_back(beg, cur);
        beg = ++cur;
    }
    words.emplace_back(beg, std::end(text));
    return words;
}
 
int main()
{
    std::list<int> v1 = { 2, 1, 3, 4, 1, 5, 6 };
    std::list<int> v2 = { 1 };
    const auto& v = tokenize(v1, v2);
    for (const auto& ve : v)
    {
        for (const auto& vec : ve)
        {
            std::cout << vec;
        }
        std::cout << std::endl;
    }
}
И да, дорабатывать её можно до посинения, например добавить перегрузки для initializer_list.
А в идеале было бы реализовать TokenizeIterator, тем самым избавившись от захардкоженного возвращаемого вектора.
1
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
11.06.2016, 13:13
Помогаю со студенческими работами здесь

В массиве определить произведение элементов с четными индексами и сумму элементов с нечетными индексами
Создание многомодульных программ ПОРЯДОК ВЫПОЛНЕНИЯ РАБОТЫ. -Составить программу,содержащую функции согласно заданного варианта ...

Найти сумму элементов с четными индексами и произведение элементов с нечетными индексами
Задан массив S(К). Найти сумму элементов с четными индексами и произведение элементов с нечетными индексами.

Найти сумму максимального значения элементов с четными индексами и минимального значения элементов с нечетными индексами в одномерном массиве
дан одномерный массив А.найти мах(a2,a4..)+мин(a1,a3) int main() { int y; cin&gt;&gt;N; for(int i=0; i&lt;N; i++) cin&gt;&gt;y; max=y;...

Запутался в циклах
Вроде бы все сделал правильно но есть ошибка Заполняю массив рандомными числами потом скалдываю все числа массива и записую результат в...

Запутался с итераторами
Привет. Никак не могу понять почему ошибка? std::string s = &quot;sEReGA&quot;; for (std::string::iterator i = s.begin(); i != s.end();...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
9
Ответ Создать тему
Новые блоги и статьи
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки radiotray-ng в m3u-плейлист
damix 19.02.2026
Это можно сделать скриптом для PowerShell. Использование . \СonvertRadiotrayToM3U. ps1 <path_to_bookmarks. json> Рядом с файлом bookmarks. json появится файл bookmarks. m3u с результатом. # Check if. . .
Семь CDC на одном интерфейсе: 5 U[S]ARTов, 1 CAN и 1 SSI
Eddy_Em 18.02.2026
Постепенно допиливаю свою "многоинтерфейсную плату". Выглядит вот так: https:/ / www. cyberforum. ru/ blog_attachment. php?attachmentid=11617&stc=1&d=1771445347 Основана на STM32F303RBT6. На борту пять. . .
Камера Toupcam IUA500KMA
Eddy_Em 12.02.2026
Т. к. у всяких "хикроботов" слишком уж мелкий пиксель, для подсмотра в ESPriF они вообще плохо годятся: уже 14 величину можно рассмотреть еле-еле лишь на экспозициях под 3 секунды (а то и больше),. . .
И ясному Солнцу
zbw 12.02.2026
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
«Знание-Сила»
zbw 12.02.2026
«Знание-Сила» «Время-Деньги» «Деньги -Пуля»
SDL3 для Web (WebAssembly): Подключение Box2D v3, физика и отрисовка коллайдеров
8Observer8 12.02.2026
Содержание блога Box2D - это библиотека для 2D физики для анимаций и игр. С её помощью можно определять были ли коллизии между конкретными объектами и вызывать обработчики событий столкновения. . . .
SDL3 для Web (WebAssembly): Загрузка PNG с прозрачным фоном с помощью SDL_LoadPNG (без SDL3_image)
8Observer8 11.02.2026
Содержание блога Библиотека SDL3 содержит встроенные инструменты для базовой работы с изображениями - без использования библиотеки SDL3_image. Пошагово создадим проект для загрузки изображения. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru