Модераторы: Daevaorn
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Помогите с созданием массива-вектора 
:(
    Опции темы
c1bby
Дата 22.12.2005, 21:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.11.2005

Репутация: нет
Всего: нет



Вот на контрольной на курсах по С++ сказали написать массив-вектор,тоесть нада сначала динамически выделить память заполнить массив,потом спросить типа хотите ещё добавить или нет?Если да,то нада разме рувеличить на столько сколько хотят добавить.Как я понимаю это нада создать 2 массива:1-основной куда первоначально будет заносится информация,а 2 для того тчобы скопировать с 1 информацию и добавить новую.
Пользовался поиском но ничего такого не нашёл везде говорят использовать класс vector.Но сказали что нада самим написать.Помогите пожалуйста.
PM MAIL   Вверх
Fighter
Дата 22.12.2005, 21:48 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 810
Регистрация: 5.1.2005

Репутация: нет
Всего: 2



Здесь можно обойтись связанным списом.
Добавлено @ 21:49
Сам напишешь, или все-таки надо реализовать.
PM MAIL   Вверх
bel_nikita
Дата 22.12.2005, 21:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата(Fighter @ 22.12.2005, 20:48)
Здесь можно обойтись связанным списом.

Не пойдёть! Требуется именно вектор, т.е. элементы последовательно должны лежать в памяти


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
c1bby
Дата 22.12.2005, 22:01 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.11.2005

Репутация: нет
Всего: нет



сказали списком стеокм и тд и тп нельзя нада массив.Как реализовать не знаю на языке С++.В теори понятно а программно нет.Помогите плз
PM MAIL   Вверх
LPBOY
Дата 22.12.2005, 22:25 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Вот простой динамический массив из книги Б. Эккеля, Ч. Эллисона

Код

#include <cstddef>
#include <iostream>
using namespace std;
 
template<class T>
class Array { 
  enum { INIT = 10 };
  T* data;
  size_t capacity;
  size_t count;
public:
  Array() {
    count = 0;
    data = new T[capacity = INIT];
  }
  ~Array() { delete [] data; }
  void push_back(const T& t) {
    if(count == capacity) {

      size_t newCap = 2 * capacity;
      T* newData = new T[newCap];
      for(size_t i = 0; i < count; ++i)
        newData[i] = data[i];
      delete [] data;
      data = newData;
      capacity = newCap;
    }
    data[count++] = t;
  }
  void pop_back() {
    if(count > 0)
      --count;
  }
  T* begin() { return data; }
  T* end() { return data + count; }
};

int main()
{
    Array<int> arr;
    for(int i = 0; i < 10; ++i)
        arr.push_back(i+3);
    //...
    for(int i = 0; i < 5; ++i)
        arr.push_back(i);

    int* e = arr.end();
    for(int* p = arr.begin(); p != e; ++p)
        cout << *p << ' ';

    return 0;
}

Если без шаблонов то так:
Код

#include <cstddef>
#include <iostream>
using namespace std;
 
class Array { 
  enum { INIT = 10 };
  int* data;
  size_t capacity;
  size_t count;
public:
  Array() {
    count = 0;
    data = new int[capacity = INIT];
  }
  ~Array() { delete [] data; }
  void push_back(const int& t) {
    if(count == capacity) {

      size_t newCap = 2 * capacity;
      int* newData = new int[newCap];
      for(size_t i = 0; i < count; ++i)
        newData[i] = data[i];
      delete [] data;
      data = newData;
      capacity = newCap;
    }
    data[count++] = t;
  }
  void pop_back() {
    if(count > 0)
      --count;
  }
  int* begin() { return data; }
  int* end() { return data + count; }
};

int main()
{
    Array arr;
    for(int i = 0; i < 10; ++i)
        arr.push_back(i+3);
    //...
    for(int i = 0; i < 5; ++i)
        arr.push_back(i);


    int* e = arr.end();
    for(int* p = arr.begin(); p != e; ++p)
        cout << *p << ' ';

    return 0;
}


Это сообщение отредактировал(а) LPBOY - 22.12.2005, 22:26
--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
c1bby
Дата 22.12.2005, 22:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 4
Регистрация: 24.11.2005

Репутация: нет
Всего: нет



Это как бы немного не то...
Надо чтобы всё происходило динамически,тоесть мы создаём массив размером
Н допустим,вводим его и в соответствии заполняем массив.Потом вопрос:
Хотите ли ещё доваить элементов?Сколько?Вот тут то и загвоздка,я не знаю как реализовать
новое выделение памяти.В начале я писал как думаю...тоесть что нужен 2 массив.
А в коде что ты привел там простовыводится заданный массив.я не увидел атм сути массивов-векторов.

PM MAIL   Вверх
bel_nikita
Дата 22.12.2005, 23:06 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Эксперт
Сообщений: 2304
Регистрация: 12.10.2003
Где: Поезд №21/22 ( ст . Прага )

Репутация: 21
Всего: 47



Цитата(c1bby @ 22.12.2005, 21:49)
Это как бы немного не то...
Надо чтобы всё происходило динамически,тоесть мы создаём массив размером
Н допустим,вводим его и в соответствии  заполняем массив.Потом вопрос:
  Хотите ли ещё доваить элементов?Сколько?Вот тут то и загвоздка,я не знаю как реализовать
  новое выделение памяти.В начале я писал как думаю...тоесть что нужен 2 массив.
  А в коде что ты привел там простовыводится заданный массив.я не увидел атм сути массивов-векторов.

А давай сам чего-нибудь подумаешь, попишешь и задашь конкретные вопросы?
LPBOY привел то, от чего нужно плясать, простую и понятную реализацию вектора. В этих строчках кода и есть вся суть!


--------------------
user posted image — регистрация доменов от 150 руб.
PM MAIL WWW ICQ   Вверх
LPBOY
Дата 22.12.2005, 23:19 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 228
Регистрация: 12.7.2005

Репутация: 20
Всего: 20



Цитата(c1bby @ 22.12.2005, 22:49)
А в коде что ты привел там простовыводится заданный массив.я не увидел атм сути массивов-векторов.

Нет это как раз динамический массив - простейший вариант vectora. При добавлении в него элементов он динамически растет.


Цитата(c1bby @ 22.12.2005, 22:49)
Надо чтобы всё происходило динамически,тоесть мы создаём массив размером
Н допустим,вводим его и в соответствии заполняем массив.Потом вопрос:
Хотите ли ещё доваить элементов?Сколько?Вот тут то и загвоздка,я не знаю как реализовать
новое выделение памяти.


Смотри как реализована функция push_back.

--------------------
Каждый человек по-своему прав, а по-моему нет...
PM MAIL   Вверх
usawal
Дата 26.12.2005, 20:37 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 30
Регистрация: 26.12.2005

Репутация: нет
Всего: -4



Почитай про функции realloc() и free(). По-моему они могут навести на интересные соображения. Тем более, что они дают возможность в данной задаче использовать всего один массив.
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0481 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.