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

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

Восстановить пароль Регистрация
 
Рейтинг: Рейтинг темы: голосов - 50, средняя оценка - 4.66
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.10.2012, 14:55     Вектор указателей и оператор "стрелка" #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
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     Вектор указателей и оператор "стрелка"
Посмотрите здесь:

Создайте вектор, хранящий десять строковых значений "zero", "one", ..., "nine" C++
C++ Наследуемым классом для комплексного числа объявить класс "радиус-вектор", имеющий данные "длина" и "угол"
error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::basic_istream<_Elem,_Traits>" C++
C++ Нужно реализовать класс "вектор" с конструкторами, которые позволяют создать нулевой вектор и вектор с произвольным кол-во элементов.
На экране изобразить стрелу и шар. Организовать управление стрелой, для попадания в шар знаками "стрелка влево", "стрелка вправо" C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
DiffEreD
 Аватар для DiffEreD
1420 / 757 / 95
Регистрация: 21.06.2011
Сообщений: 1,740
Записей в блоге: 2
09.10.2012, 15:18     Вектор указателей и оператор "стрелка" #2
А зачем так код усложнять? Там второй вектор указателей вообще не нужен.
xtorne21st
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.10.2012, 15:21  [ТС]     Вектор указателей и оператор "стрелка" #3
Цитата Сообщение от yuron_477 Посмотреть сообщение
А зачем так код усложнять? Там второй вектор указателей вообще не нужен.
Если вас не затруднит продемонстрируйте, пожалуйста, ваше решение задания.
ProNoooob
71 / 71 / 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
интересующийся
300 / 271 / 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
71 / 71 / 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
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.10.2012, 15:55  [ТС]     Вектор указателей и оператор "стрелка" #7
Цитата Сообщение от ProNoooob Посмотреть сообщение
1
cout << ptr_vect[i]->c_str()
Т.е. это строка означает, что нужно обратиться к значению на которое указывает индекс i, чтобы полчуив объект (как понял объектом является динамическая строка) обратиться к фукнции с_str()? Вот только не понятно окуда там взялась эта функция?
ProNoooob
71 / 71 / 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
интересующийся
300 / 271 / 19
Регистрация: 25.09.2010
Сообщений: 1,056
09.10.2012, 16:52  [ТС]     Вектор указателей и оператор "стрелка" #9
С оператором стрелка, благодаря вам я разобрался.
А вот функция с_str() входит в класс string и возвращает сроку с стиле С?
Я правильно понял?
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.07.2015, 16:41     Вектор указателей и оператор "стрелка"
Еще ссылки по теме:

C++ Error C2678: бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream"
Error C2678: бинарный "<<": не найден оператор, принимающий левый операнд типа "std::ifstream" C++
Бинарный ">>": не найден оператор, принимающий левый операнд типа "std::istream" C++

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

Или воспользуйтесь поиском по форуму:
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;
}
Yandex
Объявления
13.07.2015, 16:41     Вектор указателей и оператор "стрелка"
Ответ Создать тему
Опции темы

Текущее время: 04:12. Часовой пояс GMT +3.
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2016, vBulletin Solutions, Inc.
Рейтинг@Mail.ru