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

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

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

Author24 — интернет-сервис помощи студентам
Здравствуйте! Подскажите, пожалуйста, решение данной задачи:
Дан вектор типа 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;...

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

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

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

16
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
22.01.2016, 12:09 2
Итератор реализует интерфейс указателя, так что:
C++
1
*it//"разыменовываем", так, как будто это указатель.
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 48
22.01.2016, 12:21  [ТС] 3
Спасибо, но компилятору это все равно не нравится, выдает:
ошибка: no match for 'operator==' (operand types are 'std::basic_string<char>' and 'int')
if(*it == 0)
^
0
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
22.01.2016, 12:38 4
oooooowl, ну так у Вас же в векторе объекты типа string, как их сравнивать с числами? Компилятор этого не знает.
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 48
22.01.2016, 14:01  [ТС] 5
Да, я с этим разобралась, но все еще не понимаю, как мне работать с индексами. Ведь итератор должен проходить по значениям индексов, а получается, что он проходит по значениям элементов.
Подскажите, пожалуйста, как сделать так, чтобы он проходил по значению именно индексов. Если через итератор такое реализовать нельзя, то через что можно?
0
Неэпический
 Аватар для Croessmah
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
22.01.2016, 14:04 6
Цитата Сообщение от oooooowl Посмотреть сообщение
Ведь итератор должен проходить по значениям индексов, а получается, что он проходит по значениям элементов.
wtf?
Цитата Сообщение от oooooowl Посмотреть сообщение
Подскажите, пожалуйста, как сделать так, чтобы он проходил по значению именно индексов.
Что значит "проходил по значению именно индексов."?
0
337 / 185 / 80
Регистрация: 22.08.2013
Сообщений: 724
22.01.2016, 14:26 7
Цитата Сообщение от 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  [ТС] 8
Извините, может я не так формулирую, но, вот что я примерно пытаюсь сказать:
Насколько я понимаю из-за того, что мы разименовываем итератор, он в цикле проходит по самим значениям элемента вектора. Как сделать так, чтобы мы имели доступ не к значениям, а к самим индексам, то есть не к "а" и "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
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
22.01.2016, 14:33 9
Цитата Сообщение от 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  [ТС] 10
То есть не использовать итераторы, а использовать простой проход через цикл 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
18116 / 10702 / 2063
Регистрация: 27.09.2012
Сообщений: 26,958
Записей в блоге: 1
22.01.2016, 14:47 11
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 12
Лучший ответ Сообщение было отмечено 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  [ТС] 13
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 14
Цитата Сообщение от 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  [ТС] 15
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 16
Лучший ответ Сообщение было отмечено 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  [ТС] 17
nord_v, спасибо Вам большое) Буду разбираться дальше, спасибо!)
0
23.01.2016, 11:22
Надоела реклама? Зарегистрируйтесь и она исчезнет полностью.
BasicMan
Эксперт
29316 / 5623 / 2384
Регистрация: 17.02.2009
Сообщений: 30,364
Блог
23.01.2016, 11:22
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
Новые блоги и статьи
Проектирование и моделирование
hw_wired 28.01.2025
Введение в моделирование Моделирование представляет собой один из фундаментальных методов научного познания, который позволяет изучать объекты и явления через создание их упрощенных аналогов. В. . .
Алгоритмы и исполнители
hw_wired 28.01.2025
Введение в алгоритмы В современном мире информационных технологий алгоритмы играют основополагающую роль в решении различных задач и автоматизации процессов. Алгоритм представляет собой точную. . .
Хранение информации
hw_wired 28.01.2025
Введение: Роль систем хранения информации в современном мире В современную эпоху цифровых технологий эффективное хранение информации становится одним из ключевых факторов успешного развития любой. . .
Обработка числовой информации
hw_wired 28.01.2025
Введение в обработку числовой информации В современном мире обработка числовой информации стала неотъемлемой частью как профессиональной деятельности, так и повседневной жизни. Электронные таблицы. . .
Мультимедиа
hw_wired 28.01.2025
Введение в мультимедийные технологии В современном мире мультимедийные технологии стали неотъемлемой частью нашей жизни, проникнув во все сферы человеческой деятельности. Термин "мультимедиа". . .
Обработка текстовой информации
hw_wired 28.01.2025
Введение в обработку текстовой информации В современном мире обработка текстовой информации играет фундаментальную роль в различных сферах человеческой деятельности. Текстовые редакторы стали. . .
Обработка графической информации
hw_wired 28.01.2025
Введение в компьютерную графику Компьютерная графика стала неотъемлемой частью современного цифрового мира, пройдя впечатляющий путь развития от простейших черно-белых изображений до сложных. . .
Python в Алгоритмике: Решение задач
hw_wired 28.01.2025
Введение в Python и Алгоритмику В современном мире программирование стало неотъемлемой частью образования и профессионального развития. Python зарекомендовал себя как один из самых популярных и. . .
Компьютер как универсальное устройство для работы с информацией
hw_wired 28.01.2025
Введение в устройство компьютера Компьютер представляет собой универсальное электронное устройство, предназначенное для автоматической обработки информации. В современном мире компьютер стал. . .
Информация и информационные процессы
hw_wired 28.01.2025
Понятие информации и ее виды В современном мире информация является одним из фундаментальных понятий, пронизывающих все сферы человеческой деятельности. Под информацией понимают любые сведения об. . .
Алгоритмика
hw_wired 28.01.2025
Введение: Основы алгоритмики и её роль в информатике В современном мире программирование и алгоритмическое мышление стали неотъемлемой частью образования и профессиональной деятельности. . . .
Информационное моделирование
hw_wired 28.01.2025
Введение в информационное моделирование В современном мире информационное моделирование стало неотъемлемой частью научной, образовательной и профессиональной деятельности. Это мощный инструмент. . .
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2025, CyberForum.ru