enum
값을 사용하여 2D std::array
행렬을 채우는 효율적이고 적절한 방법을 찾으려고합니다. 나는이 일을하고있다 :효율적으로 2D std :: array를 enum으로 채우는 방법
#include <iostream>
#include <array>
template<class T, size_t ROW, size_t COL>
using Matrix = std::array<std::array<T, COL>, ROW>;
enum class State { FREE = 0, BUSY, BLOCKED, RESERVED };
int main() {
const int mapX = 4;
const int mapY = 9;
// create a 5x10 2D array
Matrix<State, mapY, mapX> MapMatrix;
// fill array with State::RESERVED value
for (int y = 0; y <= mapY; y++) MapMatrix[y].fill(State::RESERVED);
std::cout << "MapMatrix contains:\n";
for (int y = 0; y <= mapY; ++y) {
for (int x = 0; x <= mapX; ++x) {
std::cout << static_cast<int>(MapMatrix[x][y]) << " ";
}
std::cout << std::endl;
}
return 0;
}
루프에 대한 나는 enum
값 행렬을 채울 수있는 가장 좋은 방법 일을하고 있습니까? Matrix<State, mapY, mapX> MapMatrix
(생성자와 같은) 선언 중에 행렬을 채울 방법이 있습니까?
감사합니다!
나는 당신의 해결책, 훌륭한 본보기를 정말 좋아합니다! 또한 인덱스 시작과 관련하여 코드의 혼동을 덜어줍니다. 오늘 밤에 돌아 오면 큰지도 초기화에 대해 _chrono :: duration_ test를 수행하고 range-for 루프 채우기와 비교합니다. 감사! – Simog
500x100 배열을 수행하는 경우 배열에 채우기 위해 내 컴퓨터에서 0.182116ms가 소요되지만 range-for 루프는 0.388968ms가 걸립니다. 성능이 크게 향상됩니다! 매우 큰 숫자 (10000x10000)로 들어갈 수 있다면 벤치 마크하기가 더 쉬웠 겠지만 그 순간에 나는 분열합니다 ... 다시 한번 감사드립니다! – Simog
@Simog -'std :: array'는 스택에 데이터를 넣는다. 그래서 많은 수의 경우 스마트 포인터를 통해'std :: vector' (또는 다른 힙 기반 컨테이너) 또는'std :: array'를 사용해야합니다. – max66