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

Транспонирование матрицы - Проблема возникает в резервировании места под новую матрицу - C++

Войти
Регистрация
Восстановить пароль
Другие темы раздела
C++ Одновременная блокировка/разблокировка функционала программы http://www.cyberforum.ru/cpp-beginners/thread1242703.html
Прошу прощения за столь изворотливый заголовок темы. Опишу суть проблемы. Разрабатываю программу для работы с электронными токенами. В программе присутствуют два потока: один предназначен для выполнения основного функционала (интерпретация команд пользователя), другой - для отслеживания событий в слотах. Функционал программы в отсутствие токена ограничен. Для контроля за функционалом я...
C++ Обобщенная функция перевода строки в число В книге "С++. Сборник рецептов" нашел обобщенную функцию преобразования строки в число: #include <iostream> #include <sstream> #include <conio.h> using namespace std; template<typename T> T strNum(const string& str) { http://www.cyberforum.ru/cpp-beginners/thread1242686.html
C++ Метод хорд - проверить корректность реализации кода
Приветствую, форумчане. Хочу обратиться к вам за помощью, вот еле написала программу для метода хорд, методом шары если честно, так как сама не сильна в программировании и код был соединен из двух других, так как мне нужно не просто решение, но и подсчет числа итерации. Само собой тут что то не работает, но хоть компилируется, хотя дальше ввода данных дело не идет. Так вот, проверьте пожалуйста,...
C++ Проверить вычисления на переполнение и потерю точности
Надо написать функции арифметических действий с проверкой переполнения,потери и генерировать исключение если оно случается. Вообщем то как бы все просто, в функции сделать операцию в более широком типе и проверить с помощью констант INT_MAX, получается что для целочисленных типов максимум ULLONG_MAX. Как проверить выше ULLONG_MAX и какой максимум для dobule - 1.79769e+308? Добавлено через 10...
C++ Можно ли создать объект экспортируемого из DLL класса без лишних манипуляций? http://www.cyberforum.ru/cpp-beginners/thread1242632.html
Привет! Есть DLL, экспортирую из неё класс, можно ли в коде, имея header (файл с описанием DLL-ки) этой DLL, создать экземпляр этого класса без вызова функций каких - то из DLL? Ведь обычно для таких целей в DLL делают глобальную функцию, с названием типа GetPointer, GetClass, GetApp, QueryInterface и т.д., которая возвращает указатель на созданный в DLL-ке экземпляр класса и потом уже в коде...
C++ Каким образом пройдёт передача параметров в функцию Доброго времени! Переписываю код с Си. Есть такая вот ф-ия: cl_int clEnqueueCopyImage ( сonst size_t src_origin ) Как произойдёт передача src_origin? 1) src_origin полностью скопируется в стэк и займёт там 3*sizeof(size_t) байт 2) в стэк попадёт только адрес первого эл-та src_origin и займёт в памяти стэка sizeof(*void) подробнее

Показать сообщение отдельно
andrejap
13 / 13 / 1
Регистрация: 21.04.2013
Сообщений: 245

Транспонирование матрицы - Проблема возникает в резервировании места под новую матрицу - C++

14.08.2014, 22:39. Просмотров 200. Ответов 0
Метки (Все метки)

Здравствуйте.
Решаю классическую задачу. Страуструп в книге задал матричный вариант. А что если векторный?
Например:
1 2 3 4
5 6
7 8 9
сделать так:
1 5 7
2 6 8
3 _ 9
4

Сама проблема возникает в резервировании места под новую матрицу. Как здесь правильно поступить? У меня кроме таких костылей, как выделено комментарием "here", ничего в голову не приходит:

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
#include <vector>
#include <iostream>
#include <utility>
#include <iterator>
 
using std::vector;
using std::pair;
using std::cout;
using std::ostream_iterator;
using std::copy;
 
template <typename T>
void transpv (const vector<vector<T>>*, vector<vector<T>>* const);
 
int main() {
 
    vector<vector<int>> Vi { {1,2,3,4,5}, {10,20,30,40,40}, {100,200,300,400,500} }, Vo;
    transpv<int> (&Vi, &Vo);
    return 0;
}
 
template <typename T>
void transpv (const vector<vector<T>>* pvi, vector<vector<T>>* const pvo) {
    vector<pair<int, pair<int, int>>> coords;
    int cv {}, cx {};
    for (const auto& v : *pvi) {
        for (const auto& x : v) {
            std::cout << x << '\t';
            coords.push_back(pair<int, pair<int, int>>(x, pair<int, int>(cv, cx)));
            ++cx;
        }
        cx = 0;
        cout << '\n';
        ++cv;
    }
 
    //inverting
    for (auto& coord : coords)
        std::swap(coord.second.first, coord.second.second);
 
    pvo->resize(5); //here
    for (auto& t : *pvo) //here
        t.resize(5); //here
 
    //filling inverted data
    for (const auto& coord : coords)
        pvo->at(coord.second.first).at(coord.second.second) = coord.first;
 
    //cout-ing
    for (const auto& v: *pvo) {
        copy(v.cbegin(), v.cend(), ostream_iterator<T, char> (cout, "\t"));
        cout << '\n';
    }
 
}
Вывод:
1 2 3 4 5
10 20 30 40 40
100 200 300 400 500

1 10 100 0 0
2 20 200 0 0
3 30 300 0 0
4 40 400 0 0
5 40 500 0 0
После регистрации реклама в сообщениях будет скрыта и будут доступны все возможности форума.
 
КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2017, vBulletin Solutions, Inc.
Рейтинг@Mail.ru