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

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

22.01.2016, 12:06. Показов 25233. Ответов 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
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
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
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
22.01.2016, 12:38 4
oooooowl, ну так у Вас же в векторе объекты типа string, как их сравнивать с числами? Компилятор этого не знает.
0
0 / 0 / 0
Регистрация: 27.01.2014
Сообщений: 48
22.01.2016, 14:01  [ТС] 5
Да, я с этим разобралась, но все еще не понимаю, как мне работать с индексами. Ведь итератор должен проходить по значениям индексов, а получается, что он проходит по значениям элементов.
Подскажите, пожалуйста, как сделать так, чтобы он проходил по значению именно индексов. Если через итератор такое реализовать нельзя, то через что можно?
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 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
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
23.01.2016, 11:22
Помогаю со студенческими работами здесь

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

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

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

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


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

Или воспользуйтесь поиском по форуму:
17
Ответ Создать тему
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin
Copyright ©2000 - 2024, CyberForum.ru