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

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

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

Author24 — интернет-сервис помощи студентам
Доброго времени суток!

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

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

Понимаю, что решение на поверхности, но собрать мосх в кучу уже не могу
К вечеру нужно чтоб это несчастье уже заработало, а сил уже никаких...
Помогите кто чем может, если не трудно...
0
Лучшие ответы (1)
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
03.02.2011, 13:48
Ответы с готовыми решениями:

Создание массива указателей на методы класса TForm2
Здравствуйте! Разрабатываю приложение, состоящие из трех форм. Первая форма представляет собой...

Создание одного массива из другого с использованием указателей
Ошибка 1 error C2440: =: невозможно преобразовать "double *" в "double" 17 Ошибка 2 error C2440:...

Создание стека в виде массива указателей на разные классы
Добрый день форумчане! Очень надеюсь на вашу помощь! Сел самостоятельно изучать плюсы по Лафоре,в...

Создание массивов указателей на массивы указателей
Помогите в решении задачи: создал массив указателей на массивы указателей на строки, но компилятор...

18
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
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 / 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];
можно логику этой строки? точнее сказать в данном случае ** у нас как интерпретируется?
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.02.2011, 14:52 4
Эри, Вообще это крайне хреновая идея. Массив указателей на вектора. Не стоит смешивать указатели и STL...

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

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

Но в целом совершенно согласна что "мухи отдельно - катлеты отдельно"
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.02.2011, 15:45 6
Эри, Правильно понимаете.
А в чем сложность отслеживания вектора?
Да как в одномерном массиве, ну и не только.
Максимальная длина... Хм. Полагаю что максимальное значение size_t.
0
2022 / 1621 / 489
Регистрация: 31.05.2009
Сообщений: 3,005
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 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 8
03.02.2011, 16:50  [ТС] 8
rangerx, спасибо, очень доступный пример.


ForEveR, сложность в том, что очень привыкла работать с обычными массивами, обычными указателями. А с данной библиотекой знакома без году неделя. + к тому, как-то не выходит у меня с ними работать [с векторами]. всё как-то криво обращаюсь к ним и получается "лажа".
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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;
}
А с данной библиотекой знакома без году неделя. + к тому, как-то не выходит у меня с ними работать [с векторами]. всё как-то криво обращаюсь к ним и получается "лажа".
Тут все дело в привычке.
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.02.2011, 19:03 10
Nameless One, Таки NULL использовать не рекомендуется в С++...

Эри, Стоит привыкать. В разы удобнее, безопаснее и прочие достоинства перечислять нет смысла. Понять их можно при использовании.
Александров не зря писал - "используйте вектор по умолчанию".
1
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
03.02.2011, 19:06 11
Цитата Сообщение от ForEveR Посмотреть сообщение
Nameless One, Таки NULL использовать не рекомендуется в С++...
А в C++ он может не равняться 0? Просто в данном случае я использовал его для наглядности (ну, по крайней мере, мне кажется, что так наглядней)
0
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
03.02.2011, 19:08 12
Nameless One, Насчет может не может не знаю... Но Бьярне не советует.
0
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 8
03.02.2011, 19:25  [ТС] 13
По медленнее уважаемые! Я же записываю!)

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

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

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

Спасибо огромное Вам всем!
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
03.02.2011, 20:02 14
Я бы сразу стал использовать вектор векторов))) Но раз уж просили именно так... Мало ли чего там заковыристого надо было извлечь из массива указателей на векторы...

Цитата Сообщение от Эри Посмотреть сообщение
можно логику этой строки? точнее сказать в данном случае ** у нас как интерпретируется?
Если ещё интересно: у нас имеется тип: std::vector< int >. Нам надо создать из него массив. Т.е. *array_of_pointers (ведь имя массива - указатель на его начало). Но массив-то должен быть массивом указателей. Поэтому мы добавляем ещё одну звёздочку. Далее память выделяем под такой же тип - под массив указателей, т.е. std::vector< int > *[number_of_elements], где [] - массив, а звёздочка перед [] - указателей.
0
1 / 1 / 0
Регистрация: 03.02.2011
Сообщений: 8
03.02.2011, 20:10  [ТС] 15
А вектор, как я понимаю, как и массив не может создаться если не сказать что-то кроме типа о его наполнении?
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
03.02.2011, 20:13 16
Эри, ну память выделена не будет. Но вам об этом беспокоиться не надо, ведь он динамически расширяемый, просто юзайте push_back и ни о чём не думайте))
0
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> ]

З.Ы. если надо было убрать в тег - извиняюсь...
0
Эксперт С++
5055 / 3115 / 271
Регистрация: 11.11.2009
Сообщений: 7,044
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;
}
1
В астрале
Эксперт С++
8049 / 4806 / 655
Регистрация: 24.06.2010
Сообщений: 10,562
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;
}
3
03.02.2011, 23:50
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
03.02.2011, 23:50
Помогаю со студенческими работами здесь

Добавление нового указателя в конец массива указателей, удаление указанного элемента, добавление указателей
Здравствуйте. Помогите, пожалуйста, разобраться с одним большим заданием. Задание пока в процессе...

Массив указателей на массив строк и сортировка массива указателей
Добрый день. Поступил вопрос. Есть задача. У нас встроенный массив char mass;.Мы вводим строки до...

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

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

создание указателей в БД
Помогите, пожалуйста! Можно ли в таблице, имеющей поле с повторяющимся значением, создать не поле...

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


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

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