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

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

Войти
Регистрация
Восстановить пароль
 
 
Рейтинг: Рейтинг темы: голосов - 306, средняя оценка - 4.88
Mayonez
380 / 272 / 21
Регистрация: 26.12.2009
Сообщений: 875
#1

Как создать двухмерный вектор - C++

05.08.2010, 17:02. Просмотров 44133. Ответов 40
Метки нет (Все метки)

если в с++ vector является заменой массива в си, то как создать двухмерный вектор?
например нужно считать матрицу размером х на у из файла в вектор при этом размер матрицы неизвестен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2010, 17:02     Как создать двухмерный вектор
Посмотрите здесь:

Как правильно очистить двухмерный вектор string-ов? - C++
Всем привет! Есть двухмерный вектор string: std::vector<std::vector<std::string>> functions(2); В ходе работы программы вектор должен...

Двухмерный вектор строк - C++
Столкнулся с проблемой и нужна помощь. Как создать и заполнить двухмерный вектор? vector < vector <string> > v; C int работает:...

Вернуть двухмерный вектор с класса? - C++
Как правильно вернуть матрицу созданною через вектора из класса, в котором она созданная? вот мой код: #include <iostream> #include...

двухмерный вектор(матрица) сложение элементов и поворот на 90 градусов - C++
Нужно что бы по главной диагонали элементы были равны сумме элементов, находящихся с ним в одной строке и одном столбце. И повернуть на...

Заполнить двухмерный вектор таблицей умножения и вывести его в выходной поток - C++
Заполнить двухмерный вектор таблицей умножения и вывести его в выходной поток. То, что я написал: #include <vector> #include...

Заполнить двухмерный вектор таблицей умножения и выввести его в выходной поток - C++
Есть такое задание: Заполнить двухмерный вектор таблицей умножения и выввести его в выходной поток Реализовано хорошо и работает...

STL Заполнить двухмерный вектор таблицей умножения и вывести его в выходной поток - C++
Заполнить двухмерный вектор таблицей умножения и вывести его в выходной поток. Добавлено через 19 минут пример, но в нем ошибки ...

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
13.01.2011, 18:44     Как создать двухмерный вектор #16
Qwerty_coder, нужно заменить все лямбда-функции на обычные функции или функциональные объекты
Uanything
Сообщений: n/a
26.11.2011, 21:37     Как создать двухмерный вектор #17
Все те 4 варианта конечно хорошо. Но зачем использовать std::for_each для мелкого масива.
Могу предложить вариант попроще.

C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
#include <iostream>
#include <vector>
 
using namespace std;
 
int main (void)
{
    const int row=10;
    const int col=2;
    vector<vector<int> > tab(row);
 
    for(int i=0; i<row;i++)
    {
        tab[i].resize(col);
        for(int j=0; j<col; j++){tab[i][j]=rand() % 666; cout<<tab[i][j]<<" ";}
        cout<<'\n';
    }
    cout<<endl;
    system("pause");
Создает массив 2Х10 и выводит красиво.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
26.11.2011, 21:49     Как создать двухмерный вектор #18
Цитата Сообщение от Nameless One Посмотреть сообщение
imatrix[i].resize(col);
Цитата Сообщение от Uanything Посмотреть сообщение
tab[i].resize(col);
Почему бы не так сделать:
C++
1
vector<vector<int> > tab(row, col);
?
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
27.11.2011, 04:54     Как создать двухмерный вектор #19
Цитата Сообщение от Uanything Посмотреть сообщение
Но зачем использовать std::for_each для мелкого масива.
а где связь между размером коллекции и применимостью алгоритма std::for_each?

Цитата Сообщение от Chelioss Посмотреть сообщение
Почему бы не так сделать:
C++
1
vector<vector<int> > tab(row, col);
?
может, ты имел в виду это?
Сыроежка
Заблокирован
27.11.2011, 05:37     Как создать двухмерный вектор #20
Цитата Сообщение от Mayonez Посмотреть сообщение
если в с++ vector является заменой массива в си, то как создать двухмерный вектор?
например нужно считать матрицу размером х на у из файла в вектор при этом размер матрицы неизвестен
Вы можете объявить вектор векторов. Каждый вектор будет контролировать свуою "размерность". То есть если делать аналогию с двумерным массивом, то внутренний вектор будет задавать строку, а внешинй вектор будет определять, сколько строк вам нужно, то есть будет по мере необходимости добавлять строки.

Например, объявление "двумерного целочисленного масива с помощью вектора, можно задать следующим образом

C++
1
std:;vector<std::vector<int> > v;
Nameless One
27.11.2011, 06:13
  #21

Не по теме:

Сыроежка, тому посту уже больше года

Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
27.11.2011, 14:29     Как создать двухмерный вектор #22
Цитата Сообщение от Nameless One Посмотреть сообщение
может, ты имел в виду это?
Проверил:
C++
1
2
std::vector< std::vector< int > > matr( 2, 3 );
std::vector<std::vector<int> > matrix(2, std::vector<int>(3, 0));
В итоге получается одно и тоже.
Nameless One
Эксперт С++
5769 / 3418 / 255
Регистрация: 08.02.2010
Сообщений: 7,446
27.11.2011, 15:40     Как создать двухмерный вектор #23
Цитата Сообщение от Chelioss Посмотреть сообщение
В итоге получается одно и тоже.
и это очень, очень странно. У меня, к примеру, вот такой код:
C++
1
2
3
4
5
6
7
#include <iostream>
#include <vector>
 
int main()
{
    std::vector<std::vector<int> > matr(2, 3);
}
выдает такие ошибки при компиляции:
Код
-*- mode: compilation; default-directory: "/home/nameless/samples/cpp/" -*-
Compilation started at Sun Nov 27 21:37:34

make -j8
g++ -c -Wall -g -std=c++0x  main.cc
In file included from /usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/vector:65:0,
                 from main.cc:2:
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/bits/stl_vector.h: В функции-члене «void std::vector<_Tp, _Alloc>::_M_initialize_dispatch(_Integer, _Integer, std::__true_type) [with _Integer = int, _Tp = std::vector<int>, _Alloc = std::allocator<std::vector<int> >]»:
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/bits/stl_vector.h:340:4:   instantiated from «std::vector<_Tp, _Alloc>::vector(_InputIterator, _InputIterator, const allocator_type&) [with _InputIterator = int, _Tp = std::vector<int>, _Alloc = std::allocator<std::vector<int> >, std::vector<_Tp, _Alloc>::allocator_type = std::allocator<std::vector<int> >]»
main.cc:6:45:   instantiated from here
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/bits/stl_vector.h:1080:4: ошибка: нет подходящей функции для вызова «std::vector<std::vector<int> >::_M_fill_initialize(std::vector<std::vector<int> >::size_type, int&)»
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/bits/stl_vector.h:1080:4: замечание: candidate is:
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/bits/stl_vector.h:1122:7: замечание: void std::vector<_Tp, _Alloc>::_M_fill_initialize(std::vector<_Tp, _Alloc>::size_type, const value_type&) [with _Tp = std::vector<int>, _Alloc = std::allocator<std::vector<int> >, std::vector<_Tp, _Alloc>::size_type = long unsigned int, std::vector<_Tp, _Alloc>::value_type = std::vector<int>]
/usr/lib/gcc/x86_64-redhat-linux/4.6.1/../../../../include/c++/4.6.1/bits/stl_vector.h:1122:7: замечание:   no known conversion for argument 2 from «int» to «const value_type& {aka const std::vector<int>&}»
make: *** [main.o] Ошибка 1

Compilation exited abnormally with code 2 at Sun Nov 27 21:37:34
и это не удивительно, т.к. такая перегрузка конструктора принимает в качестве первого аргумента число элементов вектора, а в качестве второго - значение, которым эти элементы будут инициализироваться. Т.е. получается, что у нас вектор векторов типа int, но мы при создаем три элемента, которые инициализируются значением 3
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
27.11.2011, 16:28     Как создать двухмерный вектор #24
Цитата Сообщение от Chelioss Посмотреть сообщение
C++
1
2
std::vector< std::vector< int > > matr( 2, 3 );
std::vector<std::vector<int> > matrix(2, std::vector<int>(3, 0));
Вот был бы у vector'а конструктор не explicit, тогда да... Чем компилил?
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,133
27.11.2011, 17:09     Как создать двухмерный вектор #25
VS 2008

Добавлено через 4 минуты
Цитата Сообщение от Somebody Посмотреть сообщение
Вот был бы у vector'а конструктор не explicit
C++
1
2
3
4
5
    explicit vector(size_type _Count)
        : _Mybase()
        {   // construct from _Count * _Ty()
        _Construct_n(_Count, _Ty());
        }
_Count = 3

Добавлено через 3 минуты
Цитата Сообщение от Nameless One Посмотреть сообщение
и это не удивительно, т.к. такая перегрузка конструктора принимает в качестве первого аргумента число элементов вектора, а в качестве второго - значение, которым эти элементы будут инициализироваться. Т.е. получается, что у нас вектор векторов типа int, но мы при создаем три элемента, которые инициализируются значением 3
А разве числом 3 не инициализируется тип, который находится в треугольных скобках, т.е. vector< int >? Почему возможно преобразование int в vector<int> не знаю. explicit же есть.

Добавлено через 7 минут
Прохожу по всем конструкторам вектора отладкой, но понять что-то не могу.
akk
44 / 44 / 7
Регистрация: 28.01.2012
Сообщений: 341
23.07.2013, 22:00     Как создать двухмерный вектор #26
А такой вариант ничем не хуже предыдущих ? Или все таки лучше использовать как выше (вектор векторов), т. е. не смешивать указатели с вектором?
C++
1
2
3
4
5
6
7
8
9
10
11
12
    std::vector<int> * v = new std::vector<int>[10];//выделение памяти
 
    for(int i = 0; i<10; i++)//Ввод
        for(int j = 0; j<10;++j)
            v[i].push_back(i+j);
 
 
    for(int i = 0;i<10;++i)//Вывод
    {
        for(int j = 0; j<10; ++j)
            std::cout<<v[i][j]<<'\t';
    }
Или не принято классы STL объявлять как указатели. Т. е. например:
C++
1
2
    std::vector<int> * vect = new std::vector<int>;
    vect->push_back(10);
я не встречал на форуме.
Tulosba
:)
Эксперт С++
4393 / 3236 / 297
Регистрация: 19.02.2013
Сообщений: 9,045
23.07.2013, 22:42     Как создать двухмерный вектор #27
akk, лучше не мешать. Вектор придуман чтобы как раз явно с памятью не возиться.
easybudda
Эксперт CЭксперт С++
9465 / 5478 / 927
Регистрация: 25.07.2009
Сообщений: 10,502
23.07.2013, 22:54     Как создать двухмерный вектор #28
akk, а добавить строку в этот чудо-вектор как? Или удалить из середины откуда-нибудь?..
akk
44 / 44 / 7
Регистрация: 28.01.2012
Сообщений: 341
24.07.2013, 00:44     Как создать двухмерный вектор #29
Цитата Сообщение от easybudda Посмотреть сообщение
а добавить строку в этот чудо-вектор как? Или удалить из середины откуда-нибудь?
Ну в данном случаи имеется ввиду что размеры этого вектора задаются один раз и больше не изменяются. Хотя удалить можно (например что-то вроде delete (v+i); и циклом сдвинуть строки вверх).

А как тогда насчет такого использования
Цитата Сообщение от akk Посмотреть сообщение
C++
1
2
    std::vector<int> * vect = new std::vector<int>;
    vect->push_back(10);
и соответственно
C++
1
    std::vector<std::vector<int> > * v = new std::vector<std::vector<int> >;
Добавлено через 26 минут
И еще вопрос. Почему не получается скомпилировать такое (пишет ошибку неправильное использование void-выражения)
C++
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
    std::vector < std::vector< int > > matrix;
    
    for(int i = 0;i<10;++i)
    {    //VectorInt v;
        for(int j = 0; j<10; ++j)
        {
            VectorInt v;
            matrix.push_back(v.push_back(i+j));
        }
//      matrix.push_back(v);
    }   
    for(int i = 0;i<10;++i)
    {
        for(int j = 0; j<10; ++j)
        std::cout<<matrix.at(i).at(j)<<'\t';
        
        std::cout<<'\n';
    }
работает только, если полностью передавать вектор аргументом в push_back()
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
24.07.2013, 10:27     Как создать двухмерный вектор
Еще ссылки по теме:

Как создать вектор из матриц? - C++
Как с помощью контейнера vector создать вектор из матриц, которые являются двумерными динамическими массивами? P.S желательно с примером...

как создать вектор из векторов и как потом к нему обращаться? - C++
Банальный вопрос - как создать вектор из векторов и как потом к нему обращаться? вот vector&lt;int&gt; a; - это, понятное дело, вектор а, а вот...

Создать шаблонную матрицу как вектор векторов - C++
Здравствуйте! Пишу программу по матрицам. При чем матрица создается здесь как вектор векторов. Не могу никак справиться с ошибкой, не...

Как правильно создать шаблон на функцию, которая использует вектор? - C++
есть вот такая шаблонная функция, template &lt;typename T&gt; void rev(const std::vector &lt;T&gt; &amp;v){ ...

Как создать массив или вектор размера больше чем 0x7fffffff? - C++
Вопрос вот в чем.. максимальная разрядность сетки блоков нитей 2^31-1 на GPU (используя CUDA на видеокартах с Compute capability 3.0 и...


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

Или воспользуйтесь поиском по форуму:
Somebody
2786 / 1600 / 145
Регистрация: 03.12.2007
Сообщений: 4,190
Завершенные тесты: 1
24.07.2013, 10:27     Как создать двухмерный вектор #30
Цитата Сообщение от akk Посмотреть сообщение
C++
1
matrix.push_back(v.push_back(i+j));
Так push_back ничего не возвращает.
Yandex
Объявления
24.07.2013, 10:27     Как создать двухмерный вектор
Ответ Создать тему
Опции темы

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