powered by simpleCommunicator - 2.0.59     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / C++ [игнор отключен] [закрыт для гостей] / Двумерные массивы и С++
25 сообщений из 70, страница 2 из 3
Двумерные массивы и С++
    #39287412
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
SashaMercuryMasterZiv q1 Как использовать существующий функционал С++ для поиска min в столбцах матрицы?

ну, по хитрому вычислять индексы в матрице, и в цикле на range обрабатывать. или в for each.


Не может кто-нибудь привести конкретный пример, пожалуйста


http://ideone.com/wama4t
Код: plaintext
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.
#include <iostream>
#include <vector>
#include <algorithm>

template<class T>
struct array_2d : public std::vector<std::vector<T>> {
	array_2d(size_t rows, size_t cols) : std::vector<std::vector<T>>(rows, std::vector<T>(cols)) {}
};


int main() {
	size_t rows = 5, cols = 10;

	array_2d<int> a2d(rows, cols);
	
	// fill 2d-matrix
	int counter = 0;
	for(auto &c: a2d) {
		for(auto &r: c) {
			r = ++counter;
			std::cout << r << ", ";
		}
		std::cout << std::endl;
	}
	std::cout << std::endl;

	std::vector<int> min_row;
	std::vector<int> min_col = a2d[0];
	
	// min for each - row
	for(auto &c: a2d) 
		min_row.push_back( *std::min_element(c.begin(), c.end()) );

	// min for each - col
	for(auto &c: a2d) 
		std::transform(c.begin(), c.end(), min_col.begin(), min_col.begin(), 
			 [](auto v1, auto v2) { return std::min(v1, v2); } );

	for(auto &mr: min_row) std::cout << mr << ", ";
	std::cout << std::endl;

	for(auto &mc: min_col) std::cout << mc << ", ";
	std::cout << std::endl;

	return 0;
}



Пара плюсов:
1. Работает для любых типов, для которых определен <

2. Чем хороши стандартные алгоритмы, что при необходимости легко можно использовать их параллельные версии:
thrust::transform для распараллеливания на CPU или GPU - в зависимости от типа переданного вектора.
Можно ставить на CPU-only машины.

Или в будущем когда разродятся в стандарте std::experimental::parallel::transform для распараллеливания на CPU.

А алгоритмов распаралеленных там много: https://thrust.github.io/doc/namespacethrust.html
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287541
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TmaytonТак что решили? 5-мерным массивам дать жизнь?
Или обойдемся проекциями на одномерный?
ИМХУ Задачу надо конкретную. Под нее структуру хранения выбирать.
Мне послышался тезис об изменениях в language.

А как можно language - под задачу? Нонсенс.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287553
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
maytonDima Tпропущено...

ИМХУ Задачу надо конкретную. Под нее структуру хранения выбирать.
Мне послышался тезис об изменениях в language.

А как можно language - под задачу? Нонсенс.
Все можно, но с дуру можно и ...
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287700
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Вася Уткин,

то, что вы привели, является так называемой "хорошей практикой" ?
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39287701
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TSashaMercury0.Пусть у нас есть двумерный массив:
Код: plaintext
1.
2.
3.
4.
int** a = (int**)malloc(sizeof(int*)*n);
	for (int i = 0; i < n; ++i){
		a[i] = (int*)malloc(sizeof(int)*m);
	}


Выделяй память одним большим куском
Код: plaintext
1.
2.
void p* = malloc(sizeof(int*)*n + sizeof(int)*m*n);
...



Какие в таком случае будут преимущества?
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288701
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Изопропилв c++ забыли/не захотели сделать полноценные многомерные массивы
Правда, почему их нет? Сейчас дорабатываю один численный алгоритм, оперирую несколькими массивами массивов, на динамическое выделение памяти уходит 4 строчки, столько же на освобождение. Можно написать свою функцию для этого, но хотелось бы чтобы это уже было на уровне языка. Неужели этого нет в С++? Мне кажется, что я что-то просто не знаю о его возможностях
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288718
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryКакие в таком случае будут преимущества?
Возможно Дима ратовал за экономию памяти. Дешевле 1 кусок в 100 байт чем 100 кусков по 1 байту.
Плюс если ты используешь "зубчатые" массивы массивов то там теоретически
тоже может быть экономия. Но это все в теории невозможно подсчитать.
Лучше создать два макета и посмотреть как оно будет практически.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288731
Фотография Изопропил
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryоперирую несколькими массивами массивов

сравни массив массивов с массивами в Algol-68
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288796
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryСейчас дорабатываю один численный алгоритм, оперирую несколькими массивами массивов, на динамическое выделение памяти уходит 4 строчки, столько же на освобождение. Можно написать свою функцию для этого, но хотелось бы чтобы это уже было на уровне языка. Неужели этого нет в С++?
SashaMercury, твой код не имеет ничего общего с С++ .
SashaMercuryЗдравствуйте.
0.Пусть у нас есть двумерный массив:
Код: plaintext
1.
2.
3.
4.
int** a = (int**)malloc(sizeof(int*)*n);
	for (int i = 0; i < n; ++i){
		a[i] = (int*)malloc(sizeof(int)*m);
	}



malloc - это старый добрый С. А в С можно объявлять массивы переменного размера (но размер указывается только при объявлении).
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288818
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaSashaMercuryСейчас дорабатываю один численный алгоритм, оперирую несколькими массивами массивов, на динамическое выделение памяти уходит 4 строчки, столько же на освобождение. Можно написать свою функцию для этого, но хотелось бы чтобы это уже было на уровне языка. Неужели этого нет в С++?
SashaMercury, твой код не имеет ничего общего с С++ .
SashaMercuryЗдравствуйте.
0.Пусть у нас есть двумерный массив:
Код: plaintext
1.
2.
3.
4.
int** a = (int**)malloc(sizeof(int*)*n);
	for (int i = 0; i < n; ++i){
		a[i] = (int*)malloc(sizeof(int)*m);
	}



malloc - это старый добрый С. А в С можно объявлять массивы переменного размера (но размер указывается только при объявлении).

По существу вы не правы. Но даже если бы вы были правы, это не принципиально, замените malloc на new и получите те-же 4 строчки. Если у вас есть другое решение, то я буду очень рад его увидеть. Мне кажется что оно есть.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288843
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПравда, почему их нет?
Потому что
1) у всех разные требования
2) их не проблема самому реализовать
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288884
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercuryПо существу вы не правы.
Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ...

Всё прекрасно работает
Код: plaintext
1.
2.
3.
4.
5.
void f(const int n)
{
    double arr[n];
    //do some
}


Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288890
Вася Уткин
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
BagaBagaSashaMercuryПо существу вы не правы.
Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ...

Всё прекрасно работает
Код: plaintext
1.
2.
3.
4.
5.
void f(const int n)
{
    double arr[n];
    //do some
}


Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код.

С++ http://ideone.com/zbo3D9
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288899
Dima T
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaВсё прекрасно работает
Код: plaintext
1.
2.
3.
4.
5.
void f(const int n)
{
    double arr[n];
    //do some
}


Поработает до чего-то подобного
Код: plaintext
1.
2.
x = 200000;
f(x);
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288906
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaНу и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ...
Appendix C.2 п.7
Ну и по всему стандарту конечно есть куча упоминаний, про то что большинство конструкций и библиотек С являются частью С++.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288920
Фотография MasterZiv
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaSashaMercuryПо существу вы не правы.
Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ...

Всё прекрасно работает
Код: plaintext
1.
2.
3.
4.
5.
void f(const int n)
{
    double arr[n];
    //do some
}


Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код.

В последнем стандарте языка С это разрешено (объявление массива auto с размером, задаваемым переменной, т.е. в runtime), также добавлена alloca().
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288923
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
вообще-то Appendix С посвящён обеспечению совместимости. С тем же успехом можно любую фичу, хоть из того же фортрана или явы, которая "доступна для обеспечния совместимости" объявлять частью С++. Вот только нужно ли? Ведь тогда и printf, и весь С-style ввод-вывод придётся признать как "часть С++"...
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288932
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Dima TПоработает до чего-то подобного
Код: plaintext
1.
2.
x = 200000;
f(x);


Не беспокойтесь за переполнение стека раньше времени.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288938
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
MasterZivBagaBagaпропущено...

Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ...

Всё прекрасно работает
Код: plaintext
1.
2.
3.
4.
5.
void f(const int n)
{
    double arr[n];
    //do some
}


Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код.

В последнем стандарте языка С это разрешено (объявление массива auto с размером, задаваемым переменной, т.е. в runtime), также добавлена alloca().
Variable Length Array разрешен, начиная с С99. Но вы правы - и в последнем тоже.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288965
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaвообще-то Appendix С посвящён обеспечению совместимости.
Там написано что этот раздел описывает разницу между С и С++.
И в частности C.2 п.7 говорит
The C ++ standard library provides 209 standard functions from the C library (включая malloc).
Мотивация (совместимость) тут не имеет значения.
Главное "C ++ standard library provides", т.е. это часть С++.
BagaBagaВедь тогда и printf, и весь С-style ввод-вывод придётся признать как "часть С++"...
Естественно и printf - часть С++ - п.27.8.2.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288989
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Anatoly Moskovsky,
тогда у вас весь С входит в С++ как его подмножество... В этом мы немного расходимся.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39288995
Фотография Anatoly Moskovsky
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaтогда у вас весь С входит в С++ как его подмножество... В этом мы немного расходимся.
Не весь. Приложение С стандарта описывает какое подмножество С входит в С++.
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289014
Фотография mayton
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Я понял почему мне не нравятся двумерные массивы.

Они отчасти решают задачу sparse matrices, но если разработчик
хочет полного решения то ему неизбежно нужна библиотека или фреймворк
для поддержки этой сложной и интересной возможности.

А так.. на уровне ЯП оно или не нужно или легко заменить на массив std::string
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289025
Фотография SashaMercury
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
BagaBagaSashaMercuryСейчас дорабатываю один численный алгоритм, оперирую несколькими массивами массивов, на динамическое выделение памяти уходит 4 строчки, столько же на освобождение. Можно написать свою функцию для этого, но хотелось бы чтобы это уже было на уровне языка. Неужели этого нет в С++?
SashaMercury, твой код не имеет ничего общего с С++ .
SashaMercuryЗдравствуйте.
0.Пусть у нас есть двумерный массив:
Код: plaintext
1.
2.
3.
4.
int** a = (int**)malloc(sizeof(int*)*n);
	for (int i = 0; i < n; ++i){
		a[i] = (int*)malloc(sizeof(int)*m);
	}



malloc - это старый добрый С. А в С можно объявлять массивы переменного размера (но размер указывается только при объявлении).

BagaBagaSashaMercuryПо существу вы не правы.
Отличная аргументация! С чего бы это? Не покажете то существо, по которому я не прав? Ну и пункт стандарта С++, описывающий malloc как часть C++ или его стандартной библиотеки ...

Всё прекрасно работает
Код: plaintext
1.
2.
3.
4.
5.
void f(const int n)
{
    double arr[n];
    //do some
}


Обратите внимание - ни одного new/delete или malloc/free. Разумеется, откомпилится __только__ как С-код.

1. Если мой код не имеет ничего общего с С++, то с таким-же успехом вы можете утверждать что С++ не имеет ничего общего с Си.
2. Достаточно очевидно, что с аналогичным успехом можно использовать и оператор new
3. Я очень не хочу спорить по очевидным моментам как для вас, так и для меня и для всех остальных, думаю все друг друга прекрасно поняли.


Выделение памяти на стеке меня совершенно не интересует
...
Рейтинг: 0 / 0
Двумерные массивы и С++
    #39289105
BagaBaga
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
SashaMercury1. Если мой код не имеет ничего общего с С++, то с таким-же успехом вы можете утверждать что С++ не имеет ничего общего с Си.
2. Достаточно очевидно, что с аналогичным успехом можно использовать и оператор new
3. Я очень не хочу спорить по очевидным моментам как для вас, так и для меня и для всех остальных, думаю все друг друга прекрасно поняли.
Выделение памяти на стеке меня совершенно не интересует
1. Вы можете продолжать думать, что пишете на С++. И использовать malloc и new, printf и cout. Если так принято в вашей команде (если она есть). А приписывать мне чужой бред - не надо.
2. Современный С++ практически не использует оператор new. И это современный тренд развития С++. Если вам нужен контейнер с управлением памятью - используйте из библиотек (stl, boost, любая на ваш вкус, можете написать свою). Хоть vector, хоть dynarray эффективно прячут от программиста управление выделением памятью. Любое "ручное" выделение ресурса обязательно сопровождается стражем (освобождения) ресурса (RAII-идиома).
3. В чём __конкретно__ я не прав, и что же это за существо, по которому я не прав, вы так и не ответили.


Выделение памяти на стеке или в куче - детали реализации. Если для решения задачи достаточно памяти стека, я возьму стек. Иначе - буду смотреть в кучу. Или специализированные аллокаторы. Если вы не можете предсказать режим и потребляемый объем памяти, то и с выделением в куче ... мало хорошего получите (что лучше - свалиться по стеку, или засвописть систему и свалиться уже тогда?) Вы всегда знаете, где именно будет выделена память тем или иным классом? Тем же string? А в случае small-string-optimization? )
...
Рейтинг: 0 / 0
25 сообщений из 70, страница 2 из 3
Форумы / C++ [игнор отключен] [закрыт для гостей] / Двумерные массивы и С++
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]