Форум программистов, компьютерный форум CyberForum.ru

С++ для начинающих

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 50, средняя оценка - 4.66
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
#1

Вектор указателей и оператор "стрелка" - C++

09.10.2012, 14:55. Просмотров 7023. Ответов 10
Метки нет (Все метки)

Не получается реализовать отбражение содержимого контейнера, при помощи оператора ->.
Задания и мои коментарии к коду продоставлены ниже.

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
34
35
36
37
38
39
40
41
42
43
44
45
// Напишите программу, в которой определён вектор указателей на
// строки. Организуйте перебор вектора с отображением каждой
// строки и её размера при помощи оператора ->
 
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
int main()
{
   string inp_str;
   // как мне кажется, для выполнения задания необходим
   // доплнительный вектор с типом vector<string> 
   vector<string> vect;
   while(getline(cin, inp_str)) //забъём в него произвольные сроки
      vect.push_back(inp_str);
 
   // объявим вектор указателей на строки равным количеству 
   // элементов вектора строк
   
   vector<string*> ptr_vect(vect.size());
 
   // ??? теперь укажем вектор указателей на строки на вектор
   // строк... И отобразим результат
   for ( vector<string>::size_type ix = 0; ix != vect.size();
     ++ix ) {
   ptr_vect[ix] = &vect[ix];
   cout << *ptr_vect[ix] << endl;
   }
 
   // Про оператор стрелка (->) в учебнике говориться следующее:
   // (*p).foo; - обратиться к значению указателя p, чтобы получив
   // объект обратиться к его члену по имени foo. Запись 
   // p->foo аналогична (*p).foo
   
   
   // Но как это осуществить при помощи вектора указателей в
   // учебнике, к сожалению, не сказано :)
 
   //   cout << (*ptr_vect[0]).vect[0]; // FAIL
   //   cout << (*ptr_vect).vect[0]; // FAIL
 
   return 0;
}
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
09.10.2012, 14:55     Вектор указателей и оператор "стрелка"
Посмотрите здесь:
На экране изобразить стрелу и шар. Организовать управление стрелой, для попадания в шар знаками "стрелка влево", "стрелка вправо" C++
C++ Наследуемым классом для комплексного числа объявить класс "радиус-вектор", имеющий данные "длина" и "угол"
Перегрузка функций "ввести в поток", "вывести с потока", "умножить вектор на число" C++
Создайте вектор, хранящий десять строковых значений "zero", "one", ..., "nine" C++
C++ Класс "вектор" с конструкторами, позволяющими создать нулевой вектор и вектор с произвольным числом элементов
C++ В зависимости от времени года "весна", "лето", "осень", "зима" определить погоду "тепло", "жарко", "холодно", "очень холодно"
бинарный "++": "Counter" не определяет этот оператор или преобразование к типу приемлемо к встроенному C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
1429 / 766 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
09.10.2012, 15:18     Вектор указателей и оператор "стрелка" #2
А зачем так код усложнять? Там второй вектор указателей вообще не нужен.
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.10.2012, 15:21  [ТС]     Вектор указателей и оператор "стрелка" #3
Цитата Сообщение от yuron_477 Посмотреть сообщение
А зачем так код усложнять? Там второй вектор указателей вообще не нужен.
Если вас не затруднит продемонстрируйте, пожалуйста, ваше решение задания.
ProNoooob
72 / 72 / 6
Регистрация: 14.10.2009
Сообщений: 121
09.10.2012, 15:21     Вектор указателей и оператор "стрелка" #4
Вот так можно ^_^
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>
using namespace std;
 
int main()
{
   string inp_str;
   vector<string*> ptr_vect;
 
   for(int i = 0; i < 3; i++)
   {
      getline(cin, inp_str);
      ptr_vect.push_back(new string(inp_str));
   }  
 
   // правильнее использовать итераторы.
   for(size_t i = 0; i < ptr_vect.size(); i++)
   {
       cout << ptr_vect[i]->c_str() << " length: " << ptr_vect[i]->size() << endl;
   }
 
   system("pause");
 
   return 0;
}
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.10.2012, 15:38  [ТС]     Вектор указателей и оператор "стрелка" #5
ЗЫ. Я просто не вкурсе как другим способом можно определить вектор указателей на стоки.

Добавлено через 14 минут
Ну раз вы уж начали отвечать объясните пожалуйста значени
C++
1
ptr_vect.push_back(new string(inp_str));
и
C++
1
cout << ptr_vect[i]->c_str()
Что то не понятко как можно добавить в вектор динамически массив строк, и откуда во втором случаи взялась строка с стиле С?
ProNoooob
72 / 72 / 6
Регистрация: 14.10.2009
Сообщений: 121
09.10.2012, 15:44     Вектор указателей и оператор "стрелка" #6
C++
1
new string(inp_str)
Эта конструкция создает в памяти строку, инициализирует ее другой строкой и возвращает указатель на нее. Этот указатель сохраняется в векторе указателей на строки. Все элементарно.

C++
1
cout << ptr_vect[i]->c_str()
Ну вам же нужно использовать оператор ->
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.10.2012, 15:55  [ТС]     Вектор указателей и оператор "стрелка" #7
Цитата Сообщение от ProNoooob Посмотреть сообщение
1
cout << ptr_vect[i]->c_str()
Т.е. это строка означает, что нужно обратиться к значению на которое указывает индекс i, чтобы полчуив объект (как понял объектом является динамическая строка) обратиться к фукнции с_str()? Вот только не понятно окуда там взялась эта функция?
ProNoooob
72 / 72 / 6
Регистрация: 14.10.2009
Сообщений: 121
09.10.2012, 16:37     Вектор указателей и оператор "стрелка" #8
Цитата Сообщение от xtorne21st Посмотреть сообщение
Т.е. это строка означает, что нужно обратиться к значению на которое указывает индекс i, чтобы полчуив объект (как понял объектом является динамическая строка) обратиться к фукнции с_str()? Вот только не понятно окуда там взялась эта функция?
C++
1
vector<string*> ptr_vect;
У нас вектор указателей на класс строк.
Соответственно запись
C++
1
ptr_vect[i]
Означает получение указателя на объект строка. string *
В таком виде его нельзя напечатать. Нужно его разыменовать.
Либо оператором звездочка, либо стрелочкой(которая звездочка с точкой на самом деле).
Вам в задании нужно использовать стрелочку. Следовательно мы должны вызвать какую-то функцию у нашей строки. c_str() подходит идеально ^_^
xtorne21st
интересующийся
303 / 274 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.10.2012, 16:52  [ТС]     Вектор указателей и оператор "стрелка" #9
С оператором стрелка, благодаря вам я разобрался.
А вот функция с_str() входит в класс string и возвращает сроку с стиле С?
Я правильно понял?
LevSeverianin
0 / 0 / 0
Регистрация: 11.07.2015
Сообщений: 1
13.07.2015, 16:41     Вектор указателей и оператор "стрелка" #10
Тема уже не актуальна, но для тех, кто в будущем будет гуглить дам более простое решение.
это задача из книги Липмана, решение только с теми знаниями, которые Липман дал на эту задачку.
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
#include <iostream>
#include <vector>
#include <string>
using namespace std;
 
int main() {
 
    string stroka;
    vector <string> vectorr;
    string *link = &stroka;
    while (getline(cin, stroka)) {
        vectorr.push_back(*link);
    }
    vector <string>::iterator iter = vectorr.begin();
    for (vector <string>::iterator iter = vectorr.begin(); iter != vectorr.end(); iter++) {
        cout << *iter << " " << iter->size() << endl;
    }
    system("pause");
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
01.04.2017, 12:40     Вектор указателей и оператор "стрелка"
Еще ссылки по теме:
C2678 бинарный ">>": не найден оператор, принимающий левый операнд типа "std::ostream" C++
Error C2678: бинарный "<<": не найден оператор, принимающий левый операнд типа "std::ifstream" C++
C++ Error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream"
Бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" C++
C++ Исправить ошибку:error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream"

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

Или воспользуйтесь поиском по форуму:
Davidok95
0 / 0 / 0
Регистрация: 01.04.2017
Сообщений: 1
01.04.2017, 12:40     Вектор указателей и оператор "стрелка" #11
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 <string>
#include <vector>
#include <cstring>
//#include <cstddef>
 
using std::cout;
using std::cin;
using std::endl;
using std::string;
using std::vector;
 
int main(int argc, const char *argv[])
{
    vector<string*> sp_vec;
    string s1 = "this is s1 string";
    string s2 = "this is s2 string";
    sp_vec.push_back(&s1);
    sp_vec.push_back(&s2);
 
    for (vector<string*>::iterator it = sp_vec.begin(); it != sp_vec.end(); ++it)
    {
        cout << **it << " " << (*it)->size() << endl;
    }
 
}
Yandex
Объявления
01.04.2017, 12:40     Вектор указателей и оператор "стрелка"
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru