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

Доступ по итератору к элементу вектора

22.01.2016, 12:06. Показов 27158. Ответов 16

Студворк — интернет-сервис помощи студентам
Здравствуйте! Подскажите, пожалуйста, решение данной задачи:
Дан вектор типа string, в нем есть два элемента. Необходимо добавить в третий элемент вектора равенство двух предыдущих элементов, то есть примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
#include <string>
#include <iterator>
 
using namespace std;
 
int main()
{
    vector<string> str1;
    str1.push_back("a");
    str1.push_back("b");
    for(vector<string>::iterator it = str1.begin(); it != str1.end(); ++it)
    {
        if(it = 0 && it+1 ==1)// проблема в этой строчке, не понимаю, как по доступу к итератору получить необходимый элемент
        {
            str1.push_back("str1[0]=str1[1]");// то есть в третьем элементе должна быть запись "a=b"
        }
    }

Возможно, я некорректно сформулировала задание, но мне кажется, смысл примерно понятен
0
IT_Exp
Эксперт
34794 / 4073 / 2104
Регистрация: 17.06.2006
Сообщений: 32,602
Блог
22.01.2016, 12:06
Ответы с готовыми решениями:

Доступ к элементу вектора строк через геттер
Привет, у меня есть примерно такой класс: class person { private: std::vector&lt;std::string&gt; criterias; public: //.... ...

Написать функцию для класса, возращающую данный из вектора обьектов класса по итератору вектора
День=добрый как написать функцию для класса возращающую данный из вектора обьектов класса по итератору вектора?? стока запроса: ...

std::vector доступ по индексу vs доступ по итератору
std::vector&lt;int&gt; tmp; int i = 0; tmp.resize(1000000); std::vector&lt;int&gt;::iterator it = tmp.begin(); for (int m = 0;...

16
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.01.2016, 12:09
Итератор реализует интерфейс указателя, так что:
C++
1
*it//"разыменовываем", так, как будто это указатель.
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 48
22.01.2016, 12:21  [ТС]
Спасибо, но компилятору это все равно не нравится, выдает:
ошибка: no match for 'operator==' (operand types are 'std::basic_string<char>' and 'int')
if(*it == 0)
^
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.01.2016, 12:38
oooooowl, ну так у Вас же в векторе объекты типа string, как их сравнивать с числами? Компилятор этого не знает.
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 48
22.01.2016, 14:01  [ТС]
Да, я с этим разобралась, но все еще не понимаю, как мне работать с индексами. Ведь итератор должен проходить по значениям индексов, а получается, что он проходит по значениям элементов.
Подскажите, пожалуйста, как сделать так, чтобы он проходил по значению именно индексов. Если через итератор такое реализовать нельзя, то через что можно?
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.01.2016, 14:04
Цитата Сообщение от oooooowl Посмотреть сообщение
Ведь итератор должен проходить по значениям индексов, а получается, что он проходит по значениям элементов.
wtf?
Цитата Сообщение от oooooowl Посмотреть сообщение
Подскажите, пожалуйста, как сделать так, чтобы он проходил по значению именно индексов.
Что значит "проходил по значению именно индексов."?
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
22.01.2016, 14:26
Цитата Сообщение от oooooowl Посмотреть сообщение
Подскажите, пожалуйста, как сделать так, чтобы он проходил по значению именно индексов.
C++
1
2
3
4
5
6
7
8
    vector<string> str1;
    str1.push_back("abc");
    str1.push_back("bde");
    for(vector<string>::iterator it = str1.begin(); it != str1.end(); ++it)
    {
        for (int i = 0; i < (*it).size(); ++i)
            cout << (*it)[i] << endl;
    }
1
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 48
22.01.2016, 14:30  [ТС]
Извините, может я не так формулирую, но, вот что я примерно пытаюсь сказать:
Насколько я понимаю из-за того, что мы разименовываем итератор, он в цикле проходит по самим значениям элемента вектора. Как сделать так, чтобы мы имели доступ не к значениям, а к самим индексам, то есть не к "а" и "b", а к 0 и 1?

Я пытаюсь сделать по-другому, компилятор собирает программу, но ничего не пишет в консоли:
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
#include <iostream>
#include <vector>
#include <string>
#include <ostream>
#include <iterator>
 
using namespace std;
 
int main()
{
    vector<string> str1;
    str1.push_back("a");
    str1.push_back("b");
    string str2;
   for(vector<string>::iterator it = str1.begin(); it != str1.end(); ++it)
    {
        if(*it == "a" && *(it+1) == "b")
        {
            str2.push_back(str1.size()); // подскажите, какую функцию использовать, чтобы каждый элемент вектора str1 пушить в строку str2
        }
    }
    for(string::iterator it = str2.begin(); it!= str2.end(); ++it)
    {
        cout<< *it << endl;
    }
    return 0;
}
}
Добавлено через 1 минуту
nord_v, спасибо, хоть что-то стало понятнее
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.01.2016, 14:33
Цитата Сообщение от oooooowl Посмотреть сообщение
Как сделать так, чтобы мы имели доступ не к значениям, а к самим индексам, то есть не к "а" и "b", а к 0 и 1?
В данном случае это random-access итератор, поэтому индекс можно получить так:
C++
1
std::distance(str1.begin(), it)
http://www.cplusplus.com/refer... /distance/
Но если Вам нужна работа с индексами, то, возможно, проход с помощью итераторов - не Ваш выбор.
1
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 48
22.01.2016, 14:41  [ТС]
То есть не использовать итераторы, а использовать простой проход через цикл for ?
Я пыталась сделать проще, но компилятор выдает ошибку
" no matching function for call to 'std::basic_string<char> :: push_back(__gnu_cxx::__alloc_traits<std: :allocator<std::basic_string<char> > >::value_type&)'
str2.push_back(str1[i]);"
^

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
#include <iostream>
#include <vector>
#include <string>
#include <ostream>
#include <iterator>
 
using namespace std;
 
int main()
{
    vector<string> str1;
    str1.push_back("a");
    str1.push_back("b");
    string str2;
 
    for(int i=0; i<str1.size(); ++i)
    {
        if(i==0 && i+1 ==1)
        {
            str2.push_back(str1[i]);
        }
    }
    for(int i=0; i<str2.size(); ++i)
    {
        cout << str2[i] <<endl;
    }
0
Неэпический
 Аватар для Croessmah
18149 / 10731 / 2067
Регистрация: 27.09.2012
Сообщений: 27,035
Записей в блоге: 1
22.01.2016, 14:47
C++
1
if(i==0 && i+1 ==1)//можете придумать, когда при i равном нулю, i+1 будет не равно 1?
C++
1
str2.push_back(str1[i]);//а что Вы вообще этим пытаетесь сделать?
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
22.01.2016, 14:55
Лучший ответ Сообщение было отмечено oooooowl как решение

Решение

Вот так нужно? Или что?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
    vector<string> str1;
    str1.push_back("a");
    str1.push_back("b");
    string str2;
    for(vector<string>::iterator it = str1.begin(); it != str1.end(); ++it)
    {
        for (int i = 0; i < (*it).size(); ++i)
                str2.push_back((*it)[i]);
    }
    for(string::iterator it = str2.begin(); it!= str2.end(); ++it)
    {
        cout<< *it << endl;
    }
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 48
22.01.2016, 15:23  [ТС]
nord_v, да, примерно так, теперь буду дальше работать со строкой str2
спасибо!

Добавлено через 2 минуты
Croessmah, пыталась два элемента из вектора str1 (впоследствии будет больше, чем два элемента) поместить в строку str2, чтобы затем в вектор str1 поместить в конец эту самую строку str2

Добавлено через 12 минут
nord_v, подскажите, почему, когда мы задаем дополнительное условие, компилятор собирает программу, но не выводит результат
C++
1
2
3
4
5
6
7
8
    for(vector<string>::iterator it = str1.begin(); it != str1.end(); ++it)
    {
        for (int i = 0; i < (*it).size(); ++i)
            if((*it)[i] == 0)// это для примера, индекс будет впоследствии равен не 0, а переменной извне
            {
                str2.push_back((*it)[i]);
            }
    }
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
22.01.2016, 17:42
Цитата Сообщение от oooooowl Посмотреть сообщение
почему, когда мы задаем дополнительное условие, компилятор собирает программу, но не выводит результат
Вот это условие?
Цитата Сообщение от oooooowl Посмотреть сообщение
if((*it)[i] == 0)// это для примера, индекс будет впоследствии равен не 0, а переменной извне
Здесь же не индекс сравнивается с 0 (сравнение индекса будет так: if (i == 0)). Разыменование указателя возвращает элемент вектора, т.е. строку. Взятие индекса строки возвращает элемент этой строки, т.е. символ (код символа). Этот символ (его код) у тебя и сравнивается с 0. Нулю равен код символа '\0'. Условие, для твоих строк в векторе, не выполняется, в строку str2 ничего не помещается.

Добавлено через 4 минуты
Опиши ещё раз задачу, желательно с примерами.
1
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 48
22.01.2016, 21:45  [ТС]
nord_v,
Сама задача состоит в том, чтобы доказать теорему Пифагора через подобные треугольники, используя продукционную систему, то есть схему IF (что-то = чему=то) THEN (что-то = чему-то)
http://cdn.bolshoyvopros.ru/fi... b8d53a.jpg

Нам необходим вектор, в котором мы будем хранить все данные, а именно:
0 a/c
1 HB/a
2 b/c
3 AH/b
4 a^2
5 c*HB
6 b^2
7 c*AH
8 a^2 + b^2
9 c*(HB+AH)
10 c^2

также у нас есть те самые равенства "что-то = чему-то", то есть:
0 = 1
2 = 3
4 = 5
6 = 7
8 = 9
9 = 10

ну и в конце есть правило, которое выдает нам заветное "а^2 + b^2 = c^2", а именно:
IF 8 = 9 THEN 8 = 10

Итак, возвращаясь к вектору: чтобы связи "что-то = чему-то" заработали, нам необходимо написать функцию, в которую бы подавался вектор, в которой был бы цикл, проходящий по каждому элементу вектора и если бы он по индексу находил бы два нужных элемента, то в первоначальный вектор он бы пушил новый элемент, а именно - полученное равенство, то есть примерно так:
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
int main()
{
    vector<string> str1;
    str1.push_back("a/c");
    str1.push_back("HB/a");
    string str2;
    for(vector<string>::iterator it = str1.begin(); it != str1.end(); ++it)
    {
        for (int i = 0; i < (*it).size(); ++i)
        {
            if(i == 0 && (i+1) == 1)// необязательно i ==0 и i+1 ==1, вместо 0 и 1 будут подаваться переменные, которые будут сначала равны 0 и 1, затем 2 и 3, затем 4 и 5 и т.д., из связей "что-то равно чему-то"
           {
                str2.push_back((*it)[i]);// в данной строке мы разъименовываем указатель и в новую строчку помещаем последовательно "a/c" и "HB/a"
            }
        }
    }
    str1.push_back(str2);// здесь мы третьему элементу вектора присваиваем строку
    return 0;
}
Ну и далее так происходит со всеми связями и затем уже включается правило if-then

Если честно, пока формулировала задачу, лишний раз поняла, насколько она сама по себе сырая и насколько в моей предполагаемой реализации много костылей. Но это самое простое, что вообще можно придумать для доказательства теоремы Пифагора, как мне кажется.

Также, если у Вас есть предложения по улучшенной реализации (например, я хотела создавать векторы "024689" и "1357910", и потом уже их сравнивать и т.д.), то можем обсудить это уже не в данной теме, только скажите, как с Вами связаться.
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
23.01.2016, 00:33
Лучший ответ Сообщение было отмечено oooooowl как решение

Решение

Смысл задачи ускользает. Суть доказательства непонятна.
Просто код (доказательство, как таковое, отсутствует):
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
33
#include <vector>
#include <iostream>
#include <string>
#include <utility>
using namespace std;
 
void foo(vector<string>& vstr, size_t i, size_t j)
{
    vstr.push_back(vstr[i] + " = " + vstr[j]);
}
 
int main(int argc, char* argv[])
{
    string arr_str[] = {"a / c", "HB / a", "b / c", "AH / b", "a ^ 2", "c * HB",  
                        "b ^ 2", "c * AH", "a ^ 2 + b ^ 2", "c * (HB + AH)","c^2" };
                        
    size_t arr_ind[] = { 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 9, 10, 8, 10 };
                         
    vector <pair <size_t, size_t> > vp;
    
    for (int i = 0; i < sizeof(arr_ind) / sizeof(size_t); i += 2)
        vp.push_back(pair <size_t, size_t>(arr_ind[i], arr_ind[i + 1]));
    
    vector<string> vstr(arr_str, arr_str + sizeof(arr_str) / sizeof(arr_str[0]));
    
    for (size_t i = 0; i < vp.size(); ++i)
        foo(vstr, vp[i].first, vp[i].second);
    
    for (size_t i = sizeof(arr_str) / sizeof(arr_str[0]); i < vstr.size(); ++i)
        cout << vstr[i] << endl;
 
    system("pause");
}
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 48
23.01.2016, 11:22  [ТС]
nord_v, спасибо Вам большое) Буду разбираться дальше, спасибо!)
0
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.01.2016, 11:22
Помогаю со студенческими работами здесь

Как получить доступ к элементу вектора решения (solve)
Мне нужно дальше использовать результат решения системы уравнений а как обратиться к конкретному элементу? Пишешь I= а выдает I:= и...

Как обратиться к элементу вектора?
Помогите пожалуйста cout &lt;&lt; &quot;Введите размерность массива\n&quot;; int n; cin &gt;&gt; n; vector&lt;int&gt; v1(n); //Ввод...

Обращение к последнему элементу вектора
Здравствуйте, мне нужно сравнить последний элемент вектора с числом и в зависимости от того, какое это число, выполнить дальнейшие...

STL . Обращение к 12 элементу вектора
Добрый вечер, форумчане! Столкнулся вот с такой проблемой. Имеется вектор, заполненный числами, огромной длины. Но почему-то не хочет...

Дифференцирование функции по элементу вектора
Добрый день. Есть такая задача: имеется функция с заранее неизвестным числом аргументов. Сами аргументы передаются этой функции в виде...


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Реалии
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 позволяет легко создать главного героя, который не проходит сквозь стены и перемещается с заданным трением о препятствия, которые можно располагать под углом, как верхнее. . .
Конвертировать закладки 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
И ясному Солнцу, и светлой Луне. В мире покоя нет и люди не могут жить в тишине. А жить им немного лет.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2026, CyberForum.ru