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

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

Восстановить пароль Регистрация
 
 
Рейтинг: Рейтинг темы: голосов - 306, средняя оценка - 4.88
Mayonez
 Аватар для Mayonez
379 / 271 / 20
Регистрация: 26.12.2009
Сообщений: 875
05.08.2010, 17:02     Как создать двухмерный вектор #1
если в с++ vector является заменой массива в си, то как создать двухмерный вектор?
например нужно считать матрицу размером х на у из файла в вектор при этом размер матрицы неизвестен
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
05.08.2010, 17:02     Как создать двухмерный вектор
Посмотрите здесь:

как создать вектор из векторов и как потом к нему обращаться? C++
C++ Создать иерархию классов вектор(longint) и безопасный вектор с проверкой выхода за пределы
Создать иерархию классов вектор и безопасный вектор с проверкой выхода за пределы C++
C++ Нужно реализовать класс "вектор" с конструкторами, которые позволяют создать нулевой вектор и вектор с произвольным кол-во элементов.
C++ Заполнить двухмерный вектор таблицей умножения и вывести его в выходной поток
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Nameless One
27.11.2011, 06:13     Как создать двухмерный вектор
  #21

Не по теме:

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

После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Chelioss
179 / 179 / 4
Регистрация: 08.01.2011
Сообщений: 1,131
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
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
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
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 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,131
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
 Аватар для 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
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
23.07.2013, 22:42     Как создать двухмерный вектор #27
akk, лучше не мешать. Вектор придуман чтобы как раз явно с памятью не возиться.
easybudda
Модератор
Эксперт С++
 Аватар для easybudda
9373 / 5423 / 914
Регистрация: 25.07.2009
Сообщений: 10,423
23.07.2013, 22:54     Как создать двухмерный вектор #28
akk, а добавить строку в этот чудо-вектор как? Или удалить из середины откуда-нибудь?..
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()
Somebody
2770 / 1583 / 141
Регистрация: 03.12.2007
Сообщений: 4,139
Завершенные тесты: 1
24.07.2013, 10:27     Как создать двухмерный вектор #30
Цитата Сообщение от akk Посмотреть сообщение
C++
1
matrix.push_back(v.push_back(i+j));
Так push_back ничего не возвращает.
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
14.07.2014, 14:42     Как создать двухмерный вектор #31
Подскажите, как правильный синтаксис push_back при увелечении первой и второй размерности? С одномерным все норм получается, а тут понять не могу, как запись должна выглядеть...
C++
1
2
3
    std::vector<std::string> myVec;
    std::string secondStr = "qwe";
    myVec.push_back(secondStr);
C++
1
2
3
    std::vector<std::vector<std::string> > myVec2D;
    std::string secondStr = "qwe";
//Как?
Спасибо.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
14.07.2014, 14:44     Как создать двухмерный вектор #32
Как-то так:
C++
1
2
3
myVec2D.push_back(std::vector<std::string>(secondStr));
// или
myVec2D[i].push_back(secondStr);
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
14.07.2014, 14:54     Как создать двухмерный вектор #33
Цитата Сообщение от Nameless One Посмотреть сообщение
myVec.push_back(std::vector<string>(secondStr));
Дык мы помещаем строку не указывая второй размерности. И куда она при этом упадет? У нас вроде как вторая размерность при этом еще вообще не существует.

Добавлено через 3 минуты
компилятор выдал:
error C2440: <function-style-cast>: невозможно преобразовать "std::string" в "std::vector<std::string,std::allocator<_Ty>>"
это я так понимаю он как раз негодует, что мы вместо вектора во вторую размерность суем стринг.
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
14.07.2014, 15:07     Как создать двухмерный вектор #34
Цитата Сообщение от DarkMasterW Посмотреть сообщение
Дык мы помещаем строку не указывая второй размерности.
Цитата Сообщение от DarkMasterW Посмотреть сообщение
это я так понимаю он как раз негодует, что мы вместо вектора во вторую размерность суем стринг.
Второй размерности нет. Вообще. У вектора всегда одна размерность. В нашем случае мы имеем вектор (размерности один), который содержит элементы типа вектора (тоже размерности один) строк. Поэтому мы можем использовать метод .push_back двумя способами:
  1. вызывая его у внешнего вектора myVec2D, передавая в качестве параметра вектор строк;
  2. вызывая его у i-того элемента вектора myVec2D.

Ошибка же вызвана тем, что я писал из головы, и код получился нерабочим. Вот так работает:
C++
1
2
3
std::vector<std::vector<std::string>> myVec2D;
std::string secondStr = "qwe";
myVec2D.push_back(std::vector<std::string>(1, secondStr));
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
14.07.2014, 15:18     Как создать двухмерный вектор #35
Цитата Сообщение от Nameless One Посмотреть сообщение
Второй размерности нет. Вообще. У вектора всегда одна размерность. В нашем случае мы имеем вектор (размерности один), который содержит элементы типа вектора (тоже размерности один) строк
Это я понимаю. Оно и в массивах так же. Но как-то это называть то надо?
Цитата Сообщение от Nameless One Посмотреть сообщение
(1, secondStr)
1 - это что? индекс элемента вектора во второй размерности? Почему тогда не 0?
Nameless One
Эксперт С++
 Аватар для Nameless One
5755 / 3404 / 255
Регистрация: 08.02.2010
Сообщений: 7,393
14.07.2014, 15:21     Как создать двухмерный вектор #36
Цитата Сообщение от DarkMasterW Посмотреть сообщение
1 - это что? вектора во второй размерности? Почему тогда не 0?
Это параметры конструктора для vector<string> (см. документацию). Первый параметр — количество элементов в создаваемом векторе, второй параметр — это значение, которым будет заполняться вектор. В данной строке мы пихаем во «внешний» вектор myVec2D вектор строк, содержащий одну строку secondStr.
DarkMasterW
4 / 4 / 0
Регистрация: 25.10.2013
Сообщений: 227
14.07.2014, 15:31     Как создать двухмерный вектор #37
Во. Спасибо. Теперь все нестыковки стали понятны.
Voivoid
 Аватар для Voivoid
580 / 256 / 12
Регистрация: 31.03.2013
Сообщений: 1,284
14.07.2014, 15:48     Как создать двухмерный вектор #38
Есть же Boost.MultiArray
gru74ik
Модератор
 Аватар для gru74ik
3123 / 1349 / 167
Регистрация: 20.02.2013
Сообщений: 3,867
Записей в блоге: 18
14.07.2014, 21:17     Как создать двухмерный вектор #39
Цитата Сообщение от Voivoid Посмотреть сообщение
Есть же Boost.MultiArray
Пример (кусочек кода) - было бы совсем замечательно!
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
14.07.2014, 21:21     Как создать двухмерный вектор
Еще ссылки по теме:

STL Заполнить двухмерный вектор таблицей умножения и вывести его в выходной поток C++
Заполнить двухмерный вектор таблицей умножения и выввести его в выходной поток C++
Вернуть двухмерный вектор с класса? C++

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

Или воспользуйтесь поиском по форуму:
Croessmah
Модератор
Эксперт С++
 Аватар для Croessmah
11845 / 6824 / 771
Регистрация: 27.09.2012
Сообщений: 16,919
Записей в блоге: 2
Завершенные тесты: 1
14.07.2014, 21:21     Как создать двухмерный вектор #40
Цитата Сообщение от gru74ik Посмотреть сообщение
Пример кода - было бы совсем замечательно!
http://www.boost.org/doc/libs/1_55_0...ml#sec_example
Yandex
Объявления
14.07.2014, 21:21     Как создать двухмерный вектор
Ответ Создать тему
Опции темы

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