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

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

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

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

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

Понимаю, что решение на поверхности, но собрать мосх в кучу уже не могу
К вечеру нужно чтоб это несчастье уже заработало, а сил уже никаких...
Помогите кто чем может, если не трудно...
Лучшие ответы (1)
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
silent_1991
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.02.2011, 15:45     Создание массива указателей на векторы #6
Эри, Правильно понимаете.
А в чем сложность отслеживания вектора?
Да как в одномерном массиве, ну и не только.
Максимальная длина... Хм. Полагаю что максимальное значение size_t.
rangerx
1908 / 1517 / 139
Регистрация: 31.05.2009
Сообщений: 2,876
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
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
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
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 3
03.02.2011, 19:03     Создание массива указателей на векторы #10
Nameless One, Таки NULL использовать не рекомендуется в С++...

Эри, Стоит привыкать. В разы удобнее, безопаснее и прочие достоинства перечислять нет смысла. Понять их можно при использовании.
Александров не зря писал - "используйте вектор по умолчанию".
Nameless One
Эксперт С++
 Аватар для Nameless One
5753 / 3402 / 255
Регистрация: 08.02.2010
Сообщений: 7,390
03.02.2011, 19:06     Создание массива указателей на векторы #11
Цитата Сообщение от ForEveR Посмотреть сообщение
Nameless One, Таки NULL использовать не рекомендуется в С++...
А в C++ он может не равняться 0? Просто в данном случае я использовал его для наглядности (ну, по крайней мере, мне кажется, что так наглядней)
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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
Эксперт C++
4938 / 3014 / 149
Регистрация: 11.11.2009
Сообщений: 7,024
Завершенные тесты: 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++ Связь массива и указателей

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

Или воспользуйтесь поиском по форуму:
ForEveR
Модератор
Эксперт C++
 Аватар для ForEveR
7927 / 4709 / 318
Регистрация: 24.06.2010
Сообщений: 10,524
Завершенные тесты: 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     Создание массива указателей на векторы
Ответ Создать тему
Опции темы

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