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

vector<vector<double>> => 2 * vector<vector<double>> - C++

Восстановить пароль Регистрация
 
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 585
Завершенные тесты: 2
28.04.2013, 22:56     vector<vector<double>> => 2 * vector<vector<double>> #1
Здравствуйте. У меня следующий вопрос. Имеется двумерный массив, созданный через класс vector<vector<double>> и пусть последний столбец состоит из 0 и 1. Мне необходимо разделить исходную матрицу на 2 (матрицы тоже класса vector<vector<double>>): 1-я - это где все 1 , 2-я - все 0 в последних столбцах соответственно. Не подскажите как это можно сделать?
Через обычные двойные указатели - это понятно, но т.к. vector побыстрее работает в плане сортировок и т.д., то хочу перейти на него.
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.04.2013, 13:05     vector<vector<double>> => 2 * vector<vector<double>> #2
Не понял логику разделения, соответственно не могу предложить код.
-=ЮрА=-
Заблокирован
Автор FAQ
30.04.2013, 15:15     vector<vector<double>> => 2 * vector<vector<double>> #3
mat_for_c, возможно подойдёт std::slice
http://www.cplusplus.com/reference/valarray/slice/

а так не помешало бы немного конкретики в плане какой из себя массив и второе как разделять, лучше рисунком на массиве 3х3
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 585
Завершенные тесты: 2
30.04.2013, 21:31  [ТС]     vector<vector<double>> => 2 * vector<vector<double>> #4
1 2 3 4 5 1
2 3 5 1 8 0
7 5 6 1 8 1
3 6 8 1 2 0
4 3 6 7 2 0
4 3 6 8 1 1
4 3 6 8 1 0
4 3 6 9 2 1

Получим:

1 2 3 4 5 1
7 5 6 1 8 1
4 3 6 8 1 1
4 3 6 8 1 1

2 3 5 1 8 0
3 6 8 1 2 0
4 3 6 7 2 0
4 3 6 8 1 0

Т.е. по сути вопрос заключается в копирование строки типа vector<double>, а как это делать через vector<> я не знаю.
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.04.2013, 21:58     vector<vector<double>> => 2 * vector<vector<double>> #5
mat_for_c,
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
#include <iostream>
#include <vector>
#include <iomanip>
 
typedef std::vector<std::vector<int>> matrix;
 
void split( const matrix& src, matrix& zero, matrix& one )
{
    for( auto& v: src )
    {
        if( v[v.size()-1] == 0 ) zero.push_back(v);
        else one.push_back(v);
    }
}
 
void print( const matrix& m )
{
    for( auto& v: m )    
    {
        for( auto& e: v )
        {
            std::cout << std::setw(5) << e;
        }
        std::cout << std::endl;
    }
}
 
int main() {
 
    matrix m = { 
    {1, 2, 3, 4, 5, 1},
    {2, 3, 5, 1, 8, 0},
    {7, 5, 6, 1, 8, 1},
    {3, 6, 8, 1, 2, 0},
    {4, 3, 6, 7, 2, 0},
    {4, 3, 6, 8, 1, 1},
    {4, 3, 6, 8, 1, 0},
    {4, 3, 6, 9, 2, 1} }; 
 
    matrix zero;
    matrix one;
    
    split( m, zero, one );
 
    print( zero );
   
    std::cout << "--------------" << std::endl;
   
    print( one );
 
    return 0;
}
https://ideone.com/r5bQfb
mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 585
Завершенные тесты: 2
30.04.2013, 22:45  [ТС]     vector<vector<double>> => 2 * vector<vector<double>> #6
а правильно я понимаю, что это код для С++11? Если да, то можно его переписать для С++98?
Tulosba
:)
Эксперт С++
4378 / 3221 / 297
Регистрация: 19.02.2013
Сообщений: 9,044
30.04.2013, 22:54     vector<vector<double>> => 2 * vector<vector<double>> #7
mat_for_c, правильно. Если не считать инициализацию векторов, то нужно преобразовать только циклы:
C++
1
for( auto& v: src )
станет чем-то вроде этого:
C++
1
for( matrix::const_iterator it=src.begin(); it != src.end(); ++it)
Вот пример для разбора: https://ideone.com/A79WBO
-=ЮрА=-
Заблокирован
Автор FAQ
30.04.2013, 23:29     vector<vector<double>> => 2 * vector<vector<double>> #8
mat_for_c, вот простой алгоритм без С+11
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
 
/*
int arr[][6] = 
{1,2,3,4,5,1}
{2,3,5,1,8,0}
{7,5,6,1,8,1}
{3,6,8,1,2,0}
{4,3,6,7,2,0}
{4,3,6,8,1,1}
{4,3,6,8,1,0}
[4,3,6,9,2,1}
 
 
1 2 3 4 5 1
7 5 6 1 8 1
4 3 6 8 1 1
4 3 6 8 1 1
 
2 3 5 1 8 0
3 6 8 1 2 0
4 3 6 7 2 0
4 3 6 8 1 0
*/
 
bool isZeroExist(int * vec, int n);
int main()
{
    int i, j;
    int arr[][6] = 
    {
        {1,2,3,4,5,1},
        {2,3,5,1,8,0},
        {7,5,6,1,8,1},
        {3,6,8,1,2,0},
        {4,3,6,7,2,0},
        {4,3,6,8,1,1},
        {4,3,6,8,1,0},
        {4,3,6,9,2,1}
    };
    int m = 8;
    int n = 6;
    vector< vector<int> > mas;
    mas.resize(m);
    cout<<"Input : "<<endl;
    for(i = 0; i < m; i++)
    {
        mas[i].resize(n);
        for(j = 0; j < n; j++)
            cout<<(mas[i][j] = arr[i][j])<<" ";
        cout<<endl;
    }
    vector< vector<int> > mas0;
    vector< vector<int> > mas1;
    for(i = 0; i < m; i++)
    {
        if(isZeroExist(arr[i], n))
            mas0.push_back(mas[i]);
        else
            mas1.push_back(mas[i]);
    }
    cout<<"Vector with zeros in rows : "<<endl;
    for(i = 0; i < mas0.size(); i++)
    {
        for(j = 0; j < mas0[i].size(); j++)
            cout<<mas0[i][j]<<" ";
        cout<<endl;
    }
    cout<<"Vector with nozeros rows : "<<endl;
    for(i = 0; i < mas0.size(); i++)
    {
        for(j = 0; j < mas1[i].size(); j++)
            cout<<mas1[i][j]<<" ";
        cout<<endl;
    }
    mas.resize(0);
    mas0.resize(0);
    mas1.resize(0);
    return 0;
}
 
bool isZeroExist(int * vec, int n)
{
    bool isZero = false;
    for(int j = 0; j < n && !isZero; j++)
        isZero = vec[j] == 0;
    return isZero;
}
Миниатюры
vector<vector<double>> => 2 * vector<vector<double>>  
-=ЮрА=-
30.04.2013, 23:30
  #9

Не по теме:

PS:

Цитата Сообщение от -=ЮрА=- Посмотреть сообщение
mas.resize(m);
* * cout<<"Input : "<<endl;
* * for(i = 0; i < m; i++)
* * {
* * * * mas[i].resize(n);
* * * * for(j = 0; j < n; j++)
* * * * * * cout<<(mas[i][j] = arr[i][j])<<" ";
* * * * cout<<endl;
* * }
- думается мне это всё можно через copy но не захотел думать

mat_for_c
 Аватар для mat_for_c
115 / 110 / 19
Регистрация: 26.04.2013
Сообщений: 585
Завершенные тесты: 2
30.04.2013, 23:31  [ТС]     vector<vector<double>> => 2 * vector<vector<double>> #10
Спасибо всем, тему можно закрывать.
MoreAnswers
Эксперт
37091 / 29110 / 5898
Регистрация: 17.06.2006
Сообщений: 43,301
30.04.2013, 23:39     vector<vector<double>> => 2 * vector<vector<double>>
Еще ссылки по теме:

C++ Записать числа из файла в двумерный массив или вектор вроде такого vector<vector<int>>
C++ Не работает функция sort (vector, vector)
Vector to double C++

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

Или воспользуйтесь поиском по форуму:
-=ЮрА=-
Заблокирован
Автор FAQ
30.04.2013, 23:39     vector<vector<double>> => 2 * vector<vector<double>> #11
Если же интересует вариант без доп векторов тогда алгоритм можно воплотить так
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
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
 
bool isZeroExist(int * vec, int n);
int main()
{
    int i, j;
    int arr[][6] = 
    {
        {1,2,3,4,5,1},
        {2,3,5,1,8,0},
        {7,5,6,1,8,1},
        {3,6,8,1,2,0},
        {4,3,6,7,2,0},
        {4,3,6,8,1,1},
        {4,3,6,8,1,0},
        {4,3,6,9,2,1}
    };
    int m = 8;
    int n = 6;
    vector< vector<int> > mas;
    mas.resize(m);
    cout<<"Input : "<<endl;
    for(i = 0; i < m; i++)
    {
        mas[i].resize(n);
        for(j = 0; j < n; j++)
            cout<<(mas[i][j] = arr[i][j])<<" ";
        cout<<endl;
    }
    cout<<"Vector after split : "<<endl;
    for(i = m - 1; 0 < i ; i--)
    {
        if(isZeroExist(arr[i], n))
        {
            mas.push_back(mas[i]);
            mas.erase(mas.begin() + i);
        }
    }
    for(i = 0; i < m; i++)
    {
        for(j = 0; j < n; j++)
            cout<<mas[i][j]<<" ";
        cout<<endl;
    }
    mas.resize(0);
    return 0;
}
 
bool isZeroExist(int * vec, int n)
{
    bool isZero = false;
    for(int j = 0; j < n && !isZero; j++)
        isZero = vec[j] == 0;
    return isZero;
}
Миниатюры
vector<vector<double>> => 2 * vector<vector<double>>  
Yandex
Объявления
30.04.2013, 23:39     vector<vector<double>> => 2 * vector<vector<double>>
Ответ Создать тему
Опции темы

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