Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Блоги Сообщество Поиск Заказать работу  
 
0 / 0 / 0
Регистрация: 24.10.2022
Сообщений: 5

Как сделать так, чтобы итератор указывал на символ элемента строкового вектора?

31.10.2022, 20:52. Показов 636. Ответов 3
Метки нет (Все метки)

Студворк — интернет-сервис помощи студентам
Всем доброго времени суток! Я случайно задался вопросом о том, можно ли сделать так, чтобы итератор указывал не не элемент
вектора, а на символ этого элемента.

Вот что я сначала сделал:
C++
1
2
3
4
5
6
7
8
9
#include <iostream>
#include <vector>
 
 
int main()
{
    std::vector <std::string> word(2, "hello");
    std::cout << *word[0].begin();
}
Данная программа выводит на консоль букву "h" как и положено. Но потом я подумал: если в этой строчке
C++
1
(std::cout << *word[0].begin())
мы используем разыменование и функцию begin( ), то можно эту инструкцию заменить просто на итератор. Я так и сделал. И вот что получилось:


C++
1
2
3
4
5
6
7
8
9
10
11
#include <iostream>
#include <vector>
 
 
int main()
{
    std::vector <std::string> word(2, "hello");
    std::vector <char>::iterator iter;
    iter = word[0].begin();
    std::cout << *iter;
}
По идее также должна выводиться буква "h", но вместо нее выводится ошибка: С2679 не найден оператор, принимающий
правый операнд типа "std::_String_iterator<std::_String_val< std::_Simple_types<_Elem>>>"

Я вообще не понимаю, почему выдает ошибку, я пробовал менять тип итератора на string, но все равно то же самое. Решил
посмотреть тип возвращаемого значения:
C++
1
std::cout << typeid(word.[0].begin()).name()
- эта строчка выводит что-то непонятное: class std::_String_iterator<class std::_String_val<struct std::_Simple_types<char> > >.
А если так:
C++
1
 std::cout << typeid(*word.[0].begin()).name()
- то выводит просто char.
Прошу, объясните пожалуйста, что здесь происходит
0
Лучшие ответы (1)
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
31.10.2022, 20:52
Ответы с готовыми решениями:

Как сделать, чтобы итератор указывал на определенный элемент контейнера?
как сделать, чтобы итератор указывал на, допустим, пятый элемент контейнера (вектора)

ООП на С++. Нужно уже готовый итератор изменить так, чтобы был использован итератор из библиотеки СТЛ
Iterator.h /* This class represent an iterator which will go through the Array container */ #pragma once #include...

Как сделать так, чтобы символ подчеркивания не добавлялся
использую masm , в библиотеки лежит функция GetProcessHandle? объявляю extrn GetProcessHandle : dword как сделать так чтобы символ...

3
Вездепух
Эксперт CЭксперт С++
 Аватар для TheCalligrapher
12942 / 6809 / 1821
Регистрация: 18.10.2014
Сообщений: 17,231
31.10.2022, 21:09
Лучший ответ Сообщение было отмечено Max102i6363 как решение

Решение

Цитата Сообщение от Max102i6363 Посмотреть сообщение
Данная программа выводит на консоль букву "h" как и положено.
Нет, не выводит. Ваш код невозможно скомпилировать из-за отсутствующего #include <string>

Также у вас нет перевода строки в конце вывода вашей программы.

Цитата Сообщение от Max102i6363 Посмотреть сообщение
случайно задался вопросом о том, можно ли сделать так, чтобы итератор указывал не не элемент вектора, а на символ этого элемента.
Что значит "итератор"? Какой именно "итератор"?

В вашем изложении как будто фигурируют два совершенно разных и ничего друг о друге не знающих типа итератора: итератор вектора и итератор строки. Итератор вектора итерирует по элементам вектора, итератор строки итерирует по символам строки. Все как обычно.

Цитата Сообщение от Max102i6363 Посмотреть сообщение
std::cout << *word[0].begin();
word[0].begin() - это итератор строки word[0]. Они имеет тип std::string::iterator.

Цитата Сообщение от Max102i6363 Посмотреть сообщение
C++
1
2
3
   std::vector <char>::iterator iter;
   iter  = word[0].begin();
   std::cout << *iter << std::endl;
По идее также должна выводиться буква "h", но вместо нее выводится ошибка: С2679 не найден оператор, принимающий
правый операнд типа "std::_String_iterator<std::_String_val< std::_Simp le_types<_Elem>>>"
Разумеется, выводится ошибка. std::vector<char>::iterator iter - это итератор для некоего std::vector<char>. При чем здесь вообще некий std::vector<char>? Откуда вы его взяли? У вас в программе ничего подобного нет. Никакого отношения к итераторам вашей строки он не имеет.

Цитата Сообщение от Max102i6363 Посмотреть сообщение
я пробовал менять тип итератора на string,
Что означает "пробовал менять тип итератора на string"? Тип итератора для std::string, как я сказал выше - это std::string::iterator. Пробуем

C++
1
2
3
4
5
6
7
8
9
10
#include <iostream>
#include <vector>
#include <string>
 
int main()
{
  std::vector <std::string> word(2, "hello");
  std::string::iterator iter = word[0].begin();
  std::cout << *iter << std::endl;
}
Все работает.
Цитата Сообщение от Max102i6363 Посмотреть сообщение
эта строчка выводит что-то непонятное: class std::_String_iterator<class std::_String_val<struct std::_Simple_types<char> > >
Это и есть полное внутренне имя для std::string::iterator.
0
 Аватар для SmallEvil
4086 / 2975 / 813
Регистрация: 29.06.2020
Сообщений: 11,000
31.10.2022, 21:10
Цитата Сообщение от Max102i6363 Посмотреть сообщение
Всем доброго времени суток! Я случайно задался вопросом о том, можно ли сделать так, чтобы итератор указывал не не элемент вектора, а на символ этого элемента.
На какой именно символ ?
C++
1
2
3
4
5
    std::vector <std::string> word(2, "hello");
    auto it_for_char = (*word.begin()).begin();
    auto it_end = (*word.begin()).end();;    
    while(it_for_char != it_end )
        cout << *it_for_char++ << ' ';

Цитата Сообщение от Max102i6363 Посмотреть сообщение
объясните пожалуйста, что здесь происходит
Про кубики, это как раз про то что тут происходит.
0
0 / 0 / 0
Регистрация: 24.10.2022
Сообщений: 5
01.11.2022, 09:17  [ТС]
SmallEvil,
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
01.11.2022, 09:17
Помогаю со студенческими работами здесь

Не знаю как сделать так чтобы как сделать так чтобы через каждые N строк таблицы выдача результатов останавливалась
from math import * a = -5 b = 10 up = 0.2 N = 15 x = a min_x = a max_x = b while a &lt;= b: y = sin(x) + abs(sin(x))

Как сделать так, чтобы VB.Net сканировал текст и находя в нем символ, выполнял действие?
Помогите, пожалуйста! Р.S. Простите за ошибки

Как сделать так, чтобы для продолжения нужно было просто нажать любой символ (не отправляя его)?
import random print('Испытпай свою удачу!') input('Чтобы крутить рулетку, напишите любые символы(это не повлияет на шанс)\n') ...

DataTable - сделать, чтобы указатель указывал на нужную строку, а не на первую
Есть DataTable, DataGridView Каждый раз когда обновляю DataTable, указатель указывает на первую строку в таблице, что вполне нормально. ...

Подскажите, пожалуйста с задачей. Как сделать так, чтобы в массив записывались следующие 4 элемента?
#include &lt;stdio.h&gt; #include &lt;stdlib.h&gt; #include &lt;time.h&gt; #define N 4 /* Сформировать с помощью датчика случайных чисел RANDOM‚...


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

Или воспользуйтесь поиском по форуму:
4
Ответ Создать тему
Новые блоги и статьи
Модульный подход на примере F#
DevAlt 06.03.2026
В блоге дяди Боба наткнулся на такое определение: В этой книге («Подход, основанный на вариантах использования») Ивар утверждает, что архитектура программного обеспечения — это структуры,. . .
Управление камерой с помощью скрипта OrbitControls.js на Three.js: Вращение, зум и панорамирование
8Observer8 05.03.2026
Содержание блога Финальная демка в браузере работает на Desktop и мобильных браузерах. Итоговый код: orbit-controls-threejs-js. zip. Сканируйте QR-код на мобильном. Вращайте камеру одним пальцем,. . .
SDL3 для Web (WebAssembly): Синхронизация спрайтов SDL3 и тел Box2D
8Observer8 04.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-sync-physics-sprites-sdl3-c. zip На первой гифке отладочные линии отключены, а на второй включены:. . .
SDL3 для Web (WebAssembly): Идентификация объектов на Box2D v3 - использование userData и событий коллизий
8Observer8 02.03.2026
Содержание блога Финальная демка в браузере. Итоговый код: finish-collision-events-sdl3-c. zip Сканируйте QR-код на мобильном и вы увидите, что появится джойстик для управления главным героем. . . .
Реалии
Hrethgir 01.03.2026
Нет, я не закончил до сих пор симулятор. Эта задача сложнее. Не получилось уйти в плавсостав, но оно и к лучшему, возможно. Точнее получалось - но сварщиком в палубную команду, а это значит, в моём. . .
Ритм жизни
kumehtar 27.02.2026
Иногда приходится жить в ритме, где дел становится всё больше, а вовлечения в происходящее — всё меньше. Плотный график не даёт вниманию закрепиться ни на одном событии. Утро начинается с быстрых,. . .
SDL3 для Web (WebAssembly): Сборка библиотек: SDL3, Box2D, FreeType, SDL3_ttf, SDL3_mixer и SDL3_image из исходников с помощью CMake и Emscripten
8Observer8 27.02.2026
Недавно вышла версия 3. 4. 2 библиотеки SDL3. На странице официальной релиза доступны исходники, готовые DLL (для x86, x64, arm64), а также библиотеки для разработки под Android, MinGW и Visual Studio. . . .
SDL3 для Web (WebAssembly): Реализация движения на Box2D v3 - трение и коллизии с повёрнутыми стенами
8Observer8 20.02.2026
Содержание блога Box2D позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru