Форум программистов, компьютерный форум, киберфорум
С++ для начинающих
Войти
Регистрация
Восстановить пароль
Карта форума Темы раздела Блоги Сообщество Поиск Заказать работу  
 
 
Рейтинг 4.54/1047: Рейтинг темы: голосов - 1047, средняя оценка - 4.54
392 / 284 / 53
Регистрация: 26.12.2009
Сообщений: 874
1

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

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

Author24 — интернет-сервис помощи студентам
если в с++ vector является заменой массива в си, то как создать двухмерный вектор?
например нужно считать матрицу размером х на у из файла в вектор при этом размер матрицы неизвестен
1
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
05.08.2010, 17:02
Ответы с готовыми решениями:

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

Двухмерный вектор строк
Столкнулся с проблемой и нужна помощь. Как создать и заполнить двухмерный вектор? vector <...

Как создать двухмерный, статический массив
Как создать двухмерный, статический массив, чтобы в него можно было вставить и числа, и символы?

Вернуть двухмерный вектор с класса?
Как правильно вернуть матрицу созданною через вектора из класса, в котором она созданная? вот мой...

40
Nameless One
27.11.2011, 06:13     Как создать двухмерный вектор
  #21

Не по теме:

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

0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
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));
В итоге получается одно и тоже.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
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, тогда да... Чем компилил?
0
186 / 186 / 21
Регистрация: 08.01.2011
Сообщений: 1,139
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 минут
Прохожу по всем конструкторам вектора отладкой, но понять что-то не могу.
0
44 / 44 / 17
Регистрация: 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);
я не встречал на форуме.
0
:)
Эксперт С++
4773 / 3267 / 497
Регистрация: 19.02.2013
Сообщений: 9,046
23.07.2013, 22:42 27
akk, лучше не мешать. Вектор придуман чтобы как раз явно с памятью не возиться.
1
Модератор
Эксперт PythonЭксперт JavaЭксперт CЭксперт С++
12458 / 7482 / 1753
Регистрация: 25.07.2009
Сообщений: 13,762
23.07.2013, 22:54 28
akk, а добавить строку в этот чудо-вектор как? Или удалить из середины откуда-нибудь?..
0
44 / 44 / 17
Регистрация: 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()
0
2835 / 1644 / 254
Регистрация: 03.12.2007
Сообщений: 4,222
24.07.2013, 10:27 30
Цитата Сообщение от akk Посмотреть сообщение
C++
1
matrix.push_back(v.push_back(i+j));
Так push_back ничего не возвращает.
0
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
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";
//Как?
Спасибо.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
14.07.2014, 14:44 32
Как-то так:
C++
1
2
3
myVec2D.push_back(std::vector<std::string>(secondStr));
// или
myVec2D[i].push_back(secondStr);
0
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
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>>"
это я так понимаю он как раз негодует, что мы вместо вектора во вторую размерность суем стринг.
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
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));
1
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
14.07.2014, 15:18 35
Цитата Сообщение от Nameless One Посмотреть сообщение
Второй размерности нет. Вообще. У вектора всегда одна размерность. В нашем случае мы имеем вектор (размерности один), который содержит элементы типа вектора (тоже размерности один) строк
Это я понимаю. Оно и в массивах так же. Но как-то это называть то надо?
Цитата Сообщение от Nameless One Посмотреть сообщение
(1, secondStr)
1 - это что? индекс элемента вектора во второй размерности? Почему тогда не 0?
0
Эксперт С++
5828 / 3479 / 358
Регистрация: 08.02.2010
Сообщений: 7,448
14.07.2014, 15:21 36
Цитата Сообщение от DarkMasterW Посмотреть сообщение
1 - это что? вектора во второй размерности? Почему тогда не 0?
Это параметры конструктора для vector<string> (см. документацию). Первый параметр — количество элементов в создаваемом векторе, второй параметр — это значение, которым будет заполняться вектор. В данной строке мы пихаем во «внешний» вектор myVec2D вектор строк, содержащий одну строку secondStr.
1
5 / 5 / 1
Регистрация: 25.10.2013
Сообщений: 230
14.07.2014, 15:31 37
Во. Спасибо. Теперь все нестыковки стали понятны.
0
710 / 283 / 16
Регистрация: 31.03.2013
Сообщений: 1,340
14.07.2014, 15:48 38
Есть же Boost.MultiArray
1
Модератор
Эксперт CЭксперт С++
5284 / 2371 / 342
Регистрация: 20.02.2013
Сообщений: 5,770
Записей в блоге: 20
14.07.2014, 21:17 39
Цитата Сообщение от Voivoid Посмотреть сообщение
Есть же Boost.MultiArray
Пример (кусочек кода) - было бы совсем замечательно!
0
Неэпический
17870 / 10635 / 2054
Регистрация: 27.09.2012
Сообщений: 26,736
Записей в блоге: 1
14.07.2014, 21:21 40
Цитата Сообщение от gru74ik Посмотреть сообщение
Пример кода - было бы совсем замечательно!
http://www.boost.org/doc/libs/... ec_example
1
14.07.2014, 21:21
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
14.07.2014, 21:21
Помогаю со студенческими работами здесь

Двухмерный вектор пары чисел(Таблица умножения)
Здравствуйте, значит есть две задачи, первая: Создать двумерный вектор пар двух целых чисел....

Класс "вектор" с конструкторами, позволяющими создать нулевой вектор и вектор с произвольным числом элементов
Привет! Задача следующая. Нужно реализовать класс &quot;вектор&quot; с конструкторами, которые позволяют...

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

Заполнить двухмерный вектор таблицей умножения и вывести его в выходной поток
Заполнить двухмерный вектор таблицей умножения и вывести его в выходной поток. То, что я...


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

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