c++)배열을 정렬할 때 질문합니다..

익명 사용자의 이미지

. 0 ~ 100까지 임의의 자연수로 채워져 있는 10x10 Matrix를 int**형 변수에 저장해 출력하고
Matrix를 행 단위로 오름차순 정렬한 후 재 출력, 행의 총 합을 기준으로 오름차순으로 정렬한
후 재 출력하는 프로그램을 작성하시오. 이 때 행의 총 합을 기준으로 정렬할 때 값을 직접 바
꾸지 않고 포인터가 가리키는 주소를 바꿔 정렬한다.

이 문제를 풀려는데 주소를 직접바꾸려하면 오류가 엄처아게 나더군요..
도움 요청합니다 ㅠㅠ

익명 사용자의 이미지

원래 이런 숙제성 질문글은 잘 안해주는데,
이번엔 제가 모처럼 C++20의 std::ranges 라이브러리를 공부 중이라 한번 해봤습니다.

정말 사랑스러운 라이브러리에요. 코드를 깔끔하게 만들어 주죠.

C++20을 지원하는 컴파일러에서 빌드해야 합니다.

#include <iostream>
#include <array>
#include <memory>
#include <random>
#include <algorithm>
 
using Row = std::array<int, 10>;
using Matrix = std::array<std::unique_ptr<Row>, 10>;
 
static int uniform_random_integer() {
	static constexpr int min = 0, max = 100;
 
	static std::random_device r;
	static std::default_random_engine engine{ r() };
	static std::uniform_int_distribution<int> uniform_dist(min, max);
 
	return uniform_dist(engine);
}
 
static std::ostream& operator<<(std::ostream& os, const Matrix& m) {
	std::ranges::for_each(m, [&os](const auto& r) { std::ranges::for_each(*r, [&os](const auto& elem) { os << elem << ' '; }); os << '\n'; });
 
	return os;
}
 
int main() {
	Matrix m;
 
	std::ranges::generate(m, []() { auto r = std::make_unique<Row>(); std::ranges::generate(*r, uniform_random_integer); return r; });
	std::cout << "initial matrix:\n" << m << '\n';
 
	std::ranges::for_each(m, [](const auto& r) { std::ranges::sort(*r); });
	std::cout << "after in-row sorting:\n" << m << '\n';
 
	std::ranges::sort(m, {}, [](const auto& r) { int sum = 0; std::ranges::for_each(*r, [&sum](const auto& elem) { sum += elem; }); return sum; });
	std::cout << "after row sorting:\n" << m << '\n';
 
	return 0;
}
Anti-Lock의 이미지

잘 봤습니다.