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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 30, средняя оценка - 4.67
Эри
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 8
#1

Создание массива указателей на векторы - C++

03.02.2011, 13:48. Просмотров 3657. Ответов 18
Метки нет (Все метки)

Доброго времени суток!

Дано:
н-дцать векторов(библиотека STL)

Необходимо:
создать массив указателей на эти вектора с целью дальнейшего их заполнения.

Понимаю, что решение на поверхности, но собрать мосх в кучу уже не могу
К вечеру нужно чтоб это несчастье уже заработало, а сил уже никаких...
Помогите кто чем может, если не трудно...
Лучшие ответы (1)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.02.2011, 13:48     Создание массива указателей на векторы
Посмотрите здесь:
Создание одного массива из другого с использованием указателей C++
C++ Создание стека в виде массива указателей на разные классы
Создание меню с использованием указателей на метод класса C++
C++ Разыменовывание массива указателей
C++ Программирование массива указателей
C++ Связь массива и указателей
Сортировка массива указателей C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.02.2011, 14:15     Создание массива указателей на векторы #2
Возможно, так?
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <vector>
 
int main()
{
    const int number_of_elements = 10;
 
    std::vector< int > **array_of_pointers = new std::vector< int > *[number_of_elements];
 
    for (size_t i = 0; i < number_of_elements; ++i)
        array_of_pointers[i] = new std::vector< int >;
 
    // Работа с массивом указателей на векторы
 
    for (size_t i = 0; i < number_of_elements; ++i)
        delete array_of_pointers[i];
 
    delete [] array_of_pointers;
 
    return 0;
}
Эри
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 8
03.02.2011, 14:46  [ТС]     Создание массива указателей на векторы #3
Хм...
Вообще очень похоже на именно то, что мне нужно.
Сейчас потыркаюсь по справочникам уточню значение size_t и окончательно определюсь.

И ещё хорошо бы понять, как у меня программа заканчивается неначавшись (но это так... оффтоп)

С size_t разобралась. Сейчас попробую в прорамме это реализовать(читай вставить в правильное место).
Единственное:

Цитата Сообщение от silent_1991 Посмотреть сообщение
std::vector< int > **array_of_pointers = new std::vector< int > *[number_of_elements];
можно логику этой строки? точнее сказать в данном случае ** у нас как интерпретируется?
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
03.02.2011, 14:52     Создание массива указателей на векторы #4
Эри, Вообще это крайне хреновая идея. Массив указателей на вектора. Не стоит смешивать указатели и STL...

C++
1
std::vector<std::vector<int> > vvec;
все же несколько предпочтительнее.
Эри
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 8
03.02.2011, 15:05  [ТС]     Создание массива указателей на векторы #5
Цитата Сообщение от ForEveR Посмотреть сообщение
Эри, Вообще это крайне хреновая идея. Массив указателей на вектора. Не стоит смешивать указатели и STL...

C++
1
std::vector<std::vector<int> > vvec;
все же несколько предпочтительнее.
Вы предлагаете создать вктор векторов, на сколько я понимаю?
Косяк в том, что строчками 20-ю ниже мне нужно будет тянуться к векторам.
Указатели я представляю как отследить, а вот с вектором несколько сложно. В векторе ведь обрашение идет как в одномерном массиве? А какая максимальная длинна такого вектора?

Но в целом совершенно согласна что "мухи отдельно - катлеты отдельно"
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
03.02.2011, 15:45     Создание массива указателей на векторы #6
Эри, Правильно понимаете.
А в чем сложность отслеживания вектора?
Да как в одномерном массиве, ну и не только.
Максимальная длина... Хм. Полагаю что максимальное значение size_t.
rangerx
1932 / 1541 / 141
Регистрация: 31.05.2009
Сообщений: 2,908
03.02.2011, 15:53     Создание массива указателей на векторы #7
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
#include <iostream>
#include <vector>
 
int main()
{
    // вектор 5x5
    std::vector< std::vector<int> > v(5, std::vector<int>(5));
 
    // заполняем
    for(size_t i = 0; i < v.size(); ++i)
        for(size_t j = 0; j < v[i].size(); ++j)
            v[i][j] = i + j;
 
    // выводим
    for(size_t i = 0; i < v.size(); ++i)
    {
        for(size_t j = 0; j < v[i].size(); ++j)
            std::cout << v[i][j] << ' ';
        std::cout << std::endl;
    }
}
Эри
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 8
03.02.2011, 16:50  [ТС]     Создание массива указателей на векторы #8
rangerx, спасибо, очень доступный пример.


ForEveR, сложность в том, что очень привыкла работать с обычными массивами, обычными указателями. А с данной библиотекой знакома без году неделя. + к тому, как-то не выходит у меня с ними работать [с векторами]. всё как-то криво обращаюсь к ним и получается "лажа".
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
03.02.2011, 18:15     Создание массива указателей на векторы #9
Цитата Сообщение от Эри Посмотреть сообщение
ForEveR, сложность в том, что очень привыкла работать с обычными массивами, обычными указателями.
У вектора есть т.н. итераторы, работа с которыми не сильно отличается от работы с указателями. Вот пример (в комментариях показан эквивалентный код с массивами и указателями):
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 <ctime>
#include <cstdlib>
 
int main()
{
    const size_t size = 15;
    const int l_t = -15;
    const int r_t =  15;
 
    srand(static_cast<size_t>(time(NULL)));
 
    /* Аналог int iarray[size] */
    std::vector<int> ivec(size);
    for(std::vector<int>::iterator it = ivec.begin(); // int* ip = iarray
    it != ivec.end();                 // ip != iarray + size
    ++it)                         // ++ip
    *it = rand() % (r_t - l_t + 1) + l_t;         // *ip = rand() % ...
    
    std::cout << "Generated vector:" << std::endl;
    for(std::vector<int>::const_iterator it = ivec.begin(); // const int* ip = array
    it != ivec.end();                   // ip != iarray + size
    ++it)                           // ++ip
    std::cout << *it << std::endl;              // std::cout << *ip << std::endl;
    
    return 0;
}
А с данной библиотекой знакома без году неделя. + к тому, как-то не выходит у меня с ними работать [с векторами]. всё как-то криво обращаюсь к ним и получается "лажа".
Тут все дело в привычке.
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
03.02.2011, 19:03     Создание массива указателей на векторы #10
Nameless One, Таки NULL использовать не рекомендуется в С++...

Эри, Стоит привыкать. В разы удобнее, безопаснее и прочие достоинства перечислять нет смысла. Понять их можно при использовании.
Александров не зря писал - "используйте вектор по умолчанию".
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,444
03.02.2011, 19:06     Создание массива указателей на векторы #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Nameless One, Таки NULL использовать не рекомендуется в С++...
А в C++ он может не равняться 0? Просто в данном случае я использовал его для наглядности (ну, по крайней мере, мне кажется, что так наглядней)
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
03.02.2011, 19:08     Создание массива указателей на векторы #12
Nameless One, Насчет может не может не знаю... Но Бьярне не советует.
Эри
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 8
03.02.2011, 19:25  [ТС]     Создание массива указателей на векторы #13
По медленнее уважаемые! Я же записываю!)

Ну вроде скрепя зубами я даже ужилась с векторами... Вроде даже они ужиилисо со мной)
Цитата Сообщение от Nameless One Посмотреть сообщение
Тут все дело в привычке.
Наверное да.

Цитата Сообщение от Nameless One
А в C++ он может не равняться 0?
насколько я помню - ноль

Цитата Сообщение от ForEveR Посмотреть сообщение
Эри, Стоит привыкать. В разы удобнее, безопаснее и прочие достоинства перечислять нет смысла. Понять их можно при использовании.
Александров не зря писал - "используйте вектор по умолчанию".
А вариантов других нету судя по всему) Да и в профессиональном смысле стоит уже начать рости.

Спасибо огромное Вам всем!
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.02.2011, 20:02     Создание массива указателей на векторы #14
Я бы сразу стал использовать вектор векторов))) Но раз уж просили именно так... Мало ли чего там заковыристого надо было извлечь из массива указателей на векторы...

Цитата Сообщение от Эри Посмотреть сообщение
можно логику этой строки? точнее сказать в данном случае ** у нас как интерпретируется?
Если ещё интересно: у нас имеется тип: std::vector< int >. Нам надо создать из него массив. Т.е. *array_of_pointers (ведь имя массива - указатель на его начало). Но массив-то должен быть массивом указателей. Поэтому мы добавляем ещё одну звёздочку. Далее память выделяем под такой же тип - под массив указателей, т.е. std::vector< int > *[number_of_elements], где [] - массив, а звёздочка перед [] - указателей.
Эри
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 8
03.02.2011, 20:10  [ТС]     Создание массива указателей на векторы #15
А вектор, как я понимаю, как и массив не может создаться если не сказать что-то кроме типа о его наполнении?
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.02.2011, 20:13     Создание массива указателей на векторы #16
Эри, ну память выделена не будет. Но вам об этом беспокоиться не надо, ведь он динамически расширяемый, просто юзайте push_back и ни о чём не думайте))
Эри
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 8
03.02.2011, 21:57  [ТС]     Создание массива указателей на векторы #17
Хм... У меня пустой совсем вектор векторов отказывается создавать.
C++
1
vector< vector<int> > Pr(50,vector<int>(1));
создаю как-то так.
В таком случае не ругается.
Ну с нулями в начале вектора я вроде обходным путем справилась, но хотелось бы узнать возможные варианты решения проблемы.
Компилятор ругается вот так:
1>f:\vkr_v_2\vkr_v_2\vkr.cpp(28) : error C2275: 'std::vector<_Ty>' : illegal use of this type as an expression
1> with
1> [
1> _Ty=int
1> ]

З.Ы. если надо было убрать в тег - извиняюсь...
silent_1991
Эксперт С++
4958 / 3034 / 149
Регистрация: 11.11.2009
Сообщений: 7,027
Завершенные тесты: 1
03.02.2011, 22:12     Создание массива указателей на векторы #18
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
#include <iostream>
#include <iomanip>
#include <vector>
 
const size_t size = 10;
 
int main()
{
    std::vector< std::vector< int > > vecvec; // Создаём "совсем пустой" вектор векторов ;)
    std::vector< int > temp;                  // Временный вектор
 
    for (size_t i = 0; i < size; ++i)
    {
        temp.clear(); // Очищаем временный вектор
 
        for (size_t j = 0; j < size; ++j)
            temp.push_back(i * 10 + (j + 1)); // Добавляем во временный вектор очередное значение
 
        vecvec.push_back(temp); // Добавляем временный вектор в конец вектора векторов)))
    }
 
    // Выводум полученную таблицу - вектор векторов
    for (size_t i = 0; i < size; ++i)
    {
        for (size_t j = 0; j < size; ++j)
            std::cout << std::setw(3) << vecvec[i][j] << "  ";
 
        std::cout << std::endl;
    }
 
    return 0;
}
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
03.02.2011, 23:50     Создание массива указателей на векторы
Еще ссылки по теме:
Удаление массива указателей C++
C++ Возвращение из функции массива указателей
C++ Переворот массива с помощью указателей
Сортировка динамического массива указателей C++
Инициализация массива указателей в классе C++

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

Или воспользуйтесь поиском по форуму:
ForEveR
В астрале
Эксперт С++
7969 / 4731 / 320
Регистрация: 24.06.2010
Сообщений: 10,539
Завершенные тесты: 3
03.02.2011, 23:50     Создание массива указателей на векторы #19
Сообщение было отмечено автором темы, экспертом или модератором как ответ
Ну и еще, если углубляться в STL...
GCC 4.5+ или MSVS 2010 для компиляции.

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
#include <iostream>
#include <vector>
#include <algorithm>
#include <iterator>
 
int main()
{
    std::vector<std::vector<int> > vecs;
    int n;
    std::cout<<"Enter size\n";
    std::cin>>n;
    vecs.resize(n);
    std::cout<<"Enter "<< n <<" vectors\n";
    std::for_each(vecs.begin(), vecs.end(), [](std::vector<int>& vc)
    {
        std::cout<<"Enter vector. Not digit for end input\n";
        std::copy(std::istream_iterator<int>(std::cin), std::istream_iterator<int>(), std::back_inserter(vc));
        std::cin.clear();
        std::cin.get();
   });
   std::for_each(vecs.begin(), vecs.end(), [](const std::vector<int>& vc)
   {
        std::copy(vc.begin(), vc.end(), std::ostream_iterator<int>(std::cout, " "));
        std::cout<<'\n';
   });
   return 0;
}
Yandex
Объявления
03.02.2011, 23:50     Создание массива указателей на векторы
Ответ Создать тему
Опции темы

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