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

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

Войти
Регистрация
Восстановить пароль
 
Рейтинг: Рейтинг темы: голосов - 54, средняя оценка - 4.72
vet
175 / 175 / 13
Регистрация: 08.04.2009
Сообщений: 1,309
#1

Как через push_back заполнить вектор векторов? - C++

03.03.2010, 14:12. Просмотров 7272. Ответов 7
Метки нет (Все метки)

Как через push_back заполнить вектор векторов?
просто вектор например так:
C++
1
2
3
4
  for(int i=0;i<100;i++)
         m.push_back(rand()/100);
for(int i=0;i<mxyz1.size();i++)
         cout <<  mxyz1[i] << " ";
а "двумерный" как правильно? :
C++
1
2
3
4
5
6
  vector<vector <float> > m1;
for(int i=0;i<100;i++)
         m1[i].push_back(rand()/100);
for(int i=0;i<m1.size();i++){
for(int j=0;j<m1.size();j++){
cout << m1[i][j] << " "; } }
Пишет ошибка доступа (ошибка сегментации)
Similar
Эксперт
41792 / 34177 / 6122
Регистрация: 12.04.2006
Сообщений: 57,940
03.03.2010, 14:12     Как через push_back заполнить вектор векторов?
Посмотрите здесь:

как создать вектор из векторов и как потом к нему обращаться? C++
Как заполнить вектор в структуре? C++
Немного поясните(вектор, push_back) C++
C++ Метод push_back заносит некорректные данные в вектор
Как правильно записать число в вектор, который состоит из векторов? C++
C++ Как объявить вектор векторов, если размеры изначально неизвестны?
Создать шаблонную матрицу как вектор векторов C++
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
R0mm
Псевдо программист
192 / 113 / 15
Регистрация: 19.09.2009
Сообщений: 303
03.03.2010, 16:21     Как через push_back заполнить вектор векторов? #2
C++
1
2
3
4
5
vector<float> tm;
vector<vector <float> > m1;
 
tm.push_back(1.3123);
m1.push_back(tm);
Chardash
1 / 1 / 2
Регистрация: 20.12.2013
Сообщений: 27
12.12.2015, 21:26     Как через push_back заполнить вектор векторов? #3
Здравствуйте, посетители ресурса! Может быть у кого-то найдется время помочь разобраться в коде?
C++ (Qt)
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
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
typedef vector<vector<double>>Elements;//вектор векторов
class Matrix
{
    Elements M;
    int R, C;//строки столбцы
public:
    //по умолчанию незадаваемые эл-ты равны нулю
    Matrix(int r, int c);//пр¤моуг матрица
    Matrix(int n);//квадр м-ца
    Matrix(int n, double d);
    ~Matrix() {};
    int GetR();
    int GetC();
    void rand(int mod);//зап случ знач по модулю mod
 
    Matrix inverse();//обрат
 
    
    vector<double> & operator[](int r);//доступ к элементу
 
    friend ostream & operator<< (ostream &os, Matrix &A); //вывод м-цы
 
};
 
 
Matrix Matrix::inverse()
{
    Matrix Ones(R, 1.0);
    Matrix A = *this;
    for (int i = 0; i < R; i++) //по всем строкам
    {
        int maxi = i;
        for (int s = i + 1; s < R; s++)
            maxi = abs(A[maxi][i]) < abs(A[s][i]) ? s : maxi; //Если maxi = abs(A[maxi][i]) < abs(A[s][i]) истинно, результатом операции будет s, в противном случае maxi
        swap(A[i], A[maxi]); 
        swap(Ones[i], Ones[maxi]);
        if (abs(A[i][i]) < eps)
            throw string("Matrix is not invertable");
 
        double buf = A[i][i];
        for (int ii = 0; ii < R; ii++)//то по всей строке
        {
            A[i][ii] /= buf;//делаем 1
            Ones[i][ii] /= buf;
        }
        for (int j = 0; j < R; j++)
        {
            if (i == j) continue;
            double buf = A[j][i];
            for (int jk = 0; jk < R; jk++)//то по всей строке
            {
                A[j][jk] -= A[i][jk] * buf;//вычитаем строку
                Ones[j][jk] -= Ones[i][jk] * buf;
            }
        }
    }
    return Ones;
}
Выше привел функцию, могу вывесить весь код. Комментарии частично мои, возможно неверные, в общем, не могу разобраться с вектором-векторов. Данная функция считает обратную матрицу. Не понятен сам алгоритм, где вычисляются миноры, определитель, транспонированная матрица? Буду очень благодарен за помощь.

Добавлено через 40 минут
Вопрос по алгоритму частично снят. Разобрался, что считают с помощью преобразований в единичную. С ветором-векторов актуально.
Dimension
Dimension
556 / 437 / 135
Регистрация: 08.04.2014
Сообщений: 1,709
Завершенные тесты: 1
12.12.2015, 21:40     Как через push_back заполнить вектор векторов? #4
что конкретно вам не понятно ?
Chardash
1 / 1 / 2
Регистрация: 20.12.2013
Сообщений: 27
12.12.2015, 22:06     Как через push_back заполнить вектор векторов? #5
Цитата Сообщение от Dimension Посмотреть сообщение
что конкретно вам не понятно ?
не могу разобраться в векторе векторов. Вот например, есть сишная функция:
C++ (Qt)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
int cFoo(
    int m,          // Число строк матрицы
    int n,          // Число столбцов матрицы
    double *a,      // Адрес массива элементов матрицы
    double eps      // Точность вычислений
    ) {
    int i, j, k, l;
    double r;
 
    i = 0; j = 0;
    while (i < m && j < n) {
        r = 0.0;
        for (k = i; k < m; ++k) {
            if (fabs(a[k*n + j]) > r) {
                l = k;     
                r = fabs(a[k*n + j]); 
            }
        }
        
        // etc
    }
 
    return i; // Возвращаем число ненулевых строк
}
Как тоже самое сделать в векторе?

Добавлено через 13 минут
или хотя бы что почитать, чтобы в этом разобраться.
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6411 / 3050 / 300
Регистрация: 04.12.2011
Сообщений: 8,242
Записей в блоге: 3
12.12.2015, 22:44     Как через push_back заполнить вектор векторов? #6
Chardash, нарушаю правило, но поскольку темы придерживаемся то:
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
33
34
35
36
#include <iostream>
#include <vector>
using namespace std;
 
template<class T>
void printf_vec(vector<vector<T>> &vec)//название си-шное для облегчения восприятия)
{
vector<vector<T>>::iterator itRow;
vector<T>::iterator itColumn;
for(itRow=vec.begin(); itRow != vec.end(); itRow++)
{
for(itColumn=(*itRow).begin(); itColumn != (*itRow).end(); itColumn++)
{
cout<<(*itColumn)<<" ";
}
cout<<endl;
}
}
 
int main()
{
int one[]={1,2,3,4,5};
int two[]={2,3,4,5,6};
int thre[]={3,4,5,6,7};
int sizeV=sizeof(one)/sizeof(one[0]);
vector<vector<int>> vec;
vector<int> oneV(&one[0], &one[sizeV]);
vector<int> twoV(&two[0], &two[sizeV]);
vector<int> threV(&thre[0], &thre[sizeV]);
vec.push_back (oneV);
vec.push_back (twoV);
vec.push_back (threV);
printf_vec<int>(vec);
    system("pause");
    return 0;
}
Chardash
1 / 1 / 2
Регистрация: 20.12.2013
Сообщений: 27
12.12.2015, 23:28     Как через push_back заполнить вектор векторов? #7
Цитата Сообщение от IGPIGP Посмотреть сообщение
Chardash, нарушаю правило, но поскольку темы придерживаемся то:
IGPIGP, прошу прощения у админов, если нарушили, не знал. Ваш пример выше понятен, спасибо. Можно тот же пример с циклом, но в стиле метода из поста 3, Matrix Matrix::inverse()? Еще не совсем ясно, как работать с вектором, если массив многомерный.

Добавлено через 13 минут
выше тот же вопрос). Если не сложно, тогда метод.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
13.12.2015, 00:13     Как через push_back заполнить вектор векторов?
Еще ссылки по теме:

C++ Есть вектор пар, как положить туда значение пары через push_back
C++ Как положить в вектор структур значение через push_back
Проверить можно ли выразить линейно один из векторов массива через заданный вектор C++
C++ 2d вектор , как заполнить, если он стоит в функции
Как обьявить вектор векторов? C++

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

Или воспользуйтесь поиском по форуму:
IGPIGP
Комп_Оратор)
Эксперт по математике/физике
6411 / 3050 / 300
Регистрация: 04.12.2011
Сообщений: 8,242
Записей в блоге: 3
13.12.2015, 00:13     Как через push_back заполнить вектор векторов? #8
Цитата Сообщение от Chardash Посмотреть сообщение
Можно тот же пример с циклом, но в стиле метода из поста 3
Можно но нежелательно. Контейнер тем и хорош, что инкапсулирует (скрывает) ненужные детали. Итераторы, это стандартные переменные косвенного обращения к элементам и лучше всего итерировать через них. Работать с вектором как с массивом потому что лень читать? Опять же не стоит.
Вектор векторов позволяет в отличие от многомерного массива создавать зубчатые многомерные структуры. То есть со строками разной длины и тут обобщённый подход особенно хорош. Не нужно передавать в функцию не размерность колонны ни размерность каждой строки. Поэкспериментируйте с примером задав разные размеры строк.
Цитата Сообщение от Chardash Посмотреть сообщение
Еще не совсем ясно, как работать с вектором, если массив многомерный.
Я показал 2-мерный. Показать больше? Пофантазируйте.
Забудьте про массив когда работаете с вектором. Всё что Вам нужно - правильно инициализировать вектор.
В моём пример содержимое исходных массивов копируется в векторы и потом вектор векторов инициализируется ими. Дальше эти массивы вектору не нужны.
Способ инициализации выберите сами. Если есть многомерный массив, значит по нему легко проитерировать
Цитата Сообщение от Chardash Посмотреть сообщение
в стиле метода из поста 3

и затолкать в векторы векторов векторов ....векторов (сколько на сколько не важно).
Пофантазируйте.
Yandex
Объявления
13.12.2015, 00:13     Как через push_back заполнить вектор векторов?
Ответ Создать тему
Опции темы

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