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

Векторы (в классах)

14.10.2011, 12:12. Показов 1789. Ответов 22
Метки нет (Все метки)

Author24 — интернет-сервис помощи студентам
Всем здравствуйте.
Никак не разберусь с векторами, а именно:
Как заменить динамический массив на векторы?

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
class Dog
{
public:
        
    // int SetAge(int age) { _age = age; }
    // пока что нужно именно таким методом
    int Age;
};
 
void main()
{
    Dog* sharik = new Dog[4];
    Dog* bobik;
    bobik->Age = 3; // бобику 3 года
 
    for(int i = 0; i<4; ++i)
    {
         sharik[i].Age = bob.Age; // Всем Шарикам столько же лет 
         cout << "Sharik number: " << i << " is: " << sharik[i].Age << " year old\n";
    }
    
    delete []sharik, bobik;
    cin.get();
}
Вывод:
Sharik number: 0 is: 3 year old
Sharik number: 1 is: 3 year old
Sharik number: 2 is: 3 year old
Sharik number: 3 is: 3 year old

Добавлено через 3 часа 10 минут
Никто не знает?)
Dog* sharik = new Dog[4];
как это объявить векторным методом?
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
14.10.2011, 12:12
Ответы с готовыми решениями:

Даны векторы А(5), В(5), С(5). Проверить есть ли среди них ортогональные векторы
Даны векторы А(5), В(5), С(5). Проверить есть ли среди них ортогональные векторы. Применить...

Даны векторы А(5), В(5), С(5). Проверить есть ли среди них коллинеарные векторы
Даны векторы А(5), В(5), С(5). Проверить есть ли среди них коллинеарные векторы. Применить...

Дан файл, компонентами которого являются n-мерные векторы. Векторы с наибольшим модулем перенести в конец файла
Дан файл, компонентами которого являются n-мерные векторы. Векторы с наибольшим модулем перенести в...

Дан файл, элементами которого являются n-мерные векторы. Векторы с наибольшим модулем перенести в конец файла
Вот имеется подобная программа (дали как пример...... в этой программе максимальные значения из...

22
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
14.10.2011, 12:15 2
Код
vector<Dog*>MyDogVector;
MyDogVector.push_back(new Dog());
MyDogVector[MyDogVector.size()-1].Age = 3;
1
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
14.10.2011, 12:36  [ТС] 3
oxotnik, Спасибо. Но появилась другая проблема. Я не могу заполнить элементы массива.
C++
1
2
for(int i=0; i<4; ++i)
    MyDogVector.at(i)->Age = 3; // программа крешится
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
14.10.2011, 12:44 4
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
void main()
{
    vector<Dog> sharik(4);
    Dog bobik;
    bobik.Age = 3; // бобику 3 года
 
    for(int i = 0; i<4; ++i)
    {
         sharik[i].Age = bobik.Age; // Всем Шарикам столько же лет 
         cout << "Sharik number: " << i << " is: " << sharik[i].Age << " year old\n";
    }
    cin.get();
}
1
448 / 211 / 21
Регистрация: 07.10.2011
Сообщений: 462
14.10.2011, 12:47 5
res, а как ты до этого вектор описал? Ты в него что-то положил, перед тем как пытаться к i-му элементу обратится?
Вот пример (шарики в векторе из объектов класса, бобики - в векторе из указателей на объекты)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
    vector<Dog> sharik;
    for(int i = 0; i<4; ++i)
    {
        sharik.push_back(Dog());
        sharik.at(i).Age=3;
         cout << "Sharik number: " << i << " is: " << sharik[i].Age << " year old\n";
    }
 
    vector<Dog*> bobik;
    for(int i = 0; i<4; ++i)
    {
        bobik.push_back(new Dog());
        bobik.at(i)->Age=3;
         cout << "Bobik number: " << i << " is: " << bobik[i]->Age << " year old\n";
    }
ну или вектор надо сразу создавать нужного размера, как в предыдущем посте
1
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
14.10.2011, 12:48 6
Цитата Сообщение от res Посмотреть сообщение
delete []sharik, bobik;
Это неверно. delete следует вызывать отдельно для каждого из указателей:
C++
1
2
delete[] sharik;
delete bobik;
1
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
14.10.2011, 13:08  [ТС] 7
rangerx, "delete следует вызывать отдельно для каждого из указателей:"
Спасибо, это из-за того что первый delete - массив? Или для всех надо вызывать отдельно?

aeshes, Описание было постом выше, модера.


gooseim,

Не по теме:

Вот он, вот он! Вот он, вектор мой. Ребята вектор!!


Спасибо, ты все сделал так, как мне нужно было)
0
aeshes
14.10.2011, 13:28
  #8

Не по теме:

res, имела в виду, сделал ли ты четыре раза push_back() для вектора, перед тем как пытаться обратится к его i-му элементу? Или только один раз?

0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
14.10.2011, 13:34 9
res, для всех отдельно. Компилятор, кстати говоря, должен был выдать предупреждение на такую запись.
0
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
14.10.2011, 13:53  [ТС] 10
rangerx, Спасибо. Viusal Studio 9 молчит.

aeshes, Не сделал, теперь понял в чём ошибка.

Теперь ещё один вопрос, как объявить вектор типа с конструктором?

C++
1
2
3
4
5
6
7
8
9
10
11
class Dog
{
public:
    Dog(float weight)  { weight = 1.5f; }
    ~Dog() {};
};
 
void main()
{
    vector <Dog(1.4f)> sharik(4); // ошибка
}
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
14.10.2011, 13:57 11
C++
1
vector <Dog> sharik(4, Dog(1.4f));
1
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
14.10.2011, 13:58 12
Цитата Сообщение от res Посмотреть сообщение
как объявить вектор типа с конструктором?
зачем?
Код
vector <Dog*>MyDogVector;
MyDogVector.push_back(new Dog(4));
1
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
14.10.2011, 14:05  [ТС] 13
gooseim,
Спасибо, я уже так пробовал, не получалось, видимо что то не верно сделал.
Работает.

oxotnik,
Все загвоздки хочу узнать, естественно это только примеры.
Твой метод отличается тем, что если выйдет за грань массива, программа не крешнит?
0
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
14.10.2011, 14:07 14
Цитата Сообщение от res Посмотреть сообщение
Твой метод отличаются тем, что если выйдет за грань массива, программа не крешнит?
за какую грань массива? вектор это "бесконечный" массив, push_back добавляет ему еще один элемент в конце. (на самом деле больше, но это внутренняя реализация)
0
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
14.10.2011, 14:20  [ТС] 15
Цитата Сообщение от oxotnik Посмотреть сообщение
за какую грань массива? вектор это "бесконечный" массив, push_back добавляет ему еще один элемент в конце. (на самом деле больше, но это внутренняя реализация)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
class Dog
{
public:
    Dog(float weight)  { weight = 1.5f; }
    ~Dog() {};
    int GetWight() const { return _weight; } 
    int Age;
private:
    int _weight;
};
 
void main()
{
    vector <Dog> pDog(4, Dog(1.3f));
    for(int i=0; i<5; ++i) // выходим за предел
    {
        pDog.at(i).Age = 14; // в пятом повторе креш
        cout << pDog.at(i).Age << endl;
    }
    cin.get();
}
такие дела
0
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
14.10.2011, 14:27 16

Не по теме:

Цитата Сообщение от res Посмотреть сообщение
такие дела
дааа.... таки дела... с дуру можно и писюн поломать


Код
void main() 
{
     vector <Dog> pDog(4, Dog(1.3f));
     for(int i=0; i< pDog.size(); ++i) // НЕ выходим за предел
     {
          pDog.at(i).Age = 14; // нету пятого повтора
          cout << pDog.at(i).Age << endl;
     }
     cin.get();
}
0
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
14.10.2011, 14:30  [ТС] 17
oxotnik, Извини, я тебя не пытался задеть.
ты потише братишка, вот в этой ситуаций.
а если не дай бог забуду поставить проверку на размерность?
0
1665 / 1134 / 80
Регистрация: 21.08.2008
Сообщений: 4,734
Записей в блоге: 1
14.10.2011, 14:32 18
Цитата Сообщение от res Посмотреть сообщение
а если не дай бог забуду поставить проверку на размерность?
ну максимум, что может получиться - большой ядерный взрыв (это если в той области работаешь), а так ну премии лишат, ну заказчик может за углом подкараулить... в общем не заморачивайся, ставь везде vector::size()
1
85 / 9 / 1
Регистрация: 05.04.2010
Сообщений: 143
15.10.2011, 11:39  [ТС] 19
Цитата Сообщение от gooseim Посмотреть сообщение
C++
1
vector <Dog> sharik(4, Dog(1.4f));
А как объявить в динамических массивах?
C++
1
Dog *sharik = new Dog(1.4f)[4]...?
0
Эксперт С++
516 / 421 / 92
Регистрация: 23.09.2010
Сообщений: 1,165
15.10.2011, 11:53 20
res
C++
1
2
Dog **sharik = new Dog*[4];
sharik[0] = new Dog(1.4f);
Для нескольких
или
C++
1
Dog *sharik = new Dog(1.4f);
для одного
1
15.10.2011, 11:53
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
15.10.2011, 11:53
Помогаю со студенческими работами здесь

Определить какие из имён встречаются во всех классах, только в некоторых классах, не встречаются ни в одном
1. Заданный имена девочек . Определить , какие из этих имён встречаются во всех классах данной...

Определить, какие из этих имен встречаются во всех классах, какие есть хотя бы в двух классах, и какие - только в одном классе
Для каждого из четырех классов указаны имена девочек, обучающихся в них. Определить, какие из этих...

Найти базисные векторы системы и выразить остальные векторы через базисные
Привет всем. Задание такое: найти базисные векторы системы и выразить остальные векторы через...

Заданы имена девочек. Определить, какие встречаются во всех классах, которые есть только в некоторых классах и какие не встречаются
Заданы имена девочек. Определить, какие из этих имен встречаются во всех классах данной параллели,...


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

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