質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

解決済

基本演算を備えた2次元配列を作る

Y.R.T
Y.R.T

総合スコア41

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。

2回答

0リアクション

0クリップ

432閲覧

投稿2020/08/17 02:19

構文内に
constexpr T& at(size_t const r, size_t const c)
{
return arr.at(r * C + c);
}

constexpr T const& at(size_t const r, size_t const c) const { return arr.at(r * C + c); }

の箇所の、(r * C + c)
は何を目的としてこのようなことをしているのですか?

#include <iostream> #include <vector> #include <algorithm> #include <iterator> template <class T, size_t R, size_t C> class array2d { typedef T value_type; typedef value_type* iterator; typedef value_type const* const_iterator; std::vector<T> arr; public: array2d() :arr(R* C) {} explicit array2d(std::initializer_list<T> l) :arr(l) {} constexpr T* data() noexcept { return arr.data(); } constexpr T const* data() const noexcept { return arr.data(); } constexpr T& at(size_t const r, size_t const c) { return arr.at(r * C + c); } constexpr T const& at(size_t const r, size_t const c) const { return arr.at(r * C + c); } constexpr T& operator() (size_t const r, size_t const c) { return arr[r * C + c]; } constexpr T const& operator() (size_t const r, size_t const c) const { return arr[r * C + c]; } constexpr bool empty() const noexcept { return R == 0 || C == 0; } constexpr size_t size(int const rank) const { if (rank == 1) return R; else if (rank == 2) return C; throw std::out_of_range("Rank is out of range!"); } void fill(T const& value) { std::fill(std::begin(arr), std::end(arr), value); } void swap(array2d& other) noexcept { arr.swap(other.arr); } const_iterator begin() const { return arr.data(); } const_iterator end() const { return arr.data() + arr.size(); } iterator begin() { return arr.data(); } iterator end() { return arr.data() + arr.size(); } }; template <class T, size_t R, size_t C> void print_array2d(array2d<T, R, C> const& arr) { for (int i = 0; i < R; ++i) { for (int j = 0; j < C; ++j) { std::cout << arr.at(i, j) << ' '; } std::cout << std::endl; } } int main() { { std::cout << "test fill" << std::endl; array2d<int, 2, 3> a; a.fill(1); print_array2d(a); } { std::cout << "test operator()" << std::endl; array2d<int, 2, 3> a; for (size_t i = 0; i < a.size(1); ++i) { for (size_t j = 0; j < a.size(2); ++j) { a(i, j) = 1 + i * 3 + j; } } print_array2d(a); } { std::cout << "test move semantics" << std::endl; array2d<int, 2, 3> a{ 10,20,30,40,50,60 }; print_array2d(a); array2d<int, 2, 3> b(std::move(a)); print_array2d(b); } { std::cout << "test swap" << std::endl; array2d<int, 2, 3> a{ 1,2,3,4,5,6 }; array2d<int, 2, 3> b{ 10,20,30,40,50,60 }; print_array2d(a); print_array2d(b); a.swap(b); print_array2d(a); print_array2d(b); } { std::cout << "test capacity" << std::endl; array2d<int, 2, 3> const a{ 1,2,3,4,5,6 }; for (size_t i = 0; i < a.size(1); ++i) { for (size_t j = 0; j < a.size(2); ++j) { std::cout << a(i, j) << ' '; } std::cout << std::endl; } } { std::cout << "test iterators" << std::endl; array2d<int, 2, 3> const a{ 1,2,3,4,5,6 }; for (auto const e : a) { std::cout << e << 'A'; } std::cout << std::endl; std::copy( std::begin(a), std::end(a), std::ostream_iterator<int>(std::cout, "B")); std::cout << std::endl; } }

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

C++

C++はC言語をもとにしてつくられた最もよく使われるマルチパラダイムプログラミング言語の1つです。オブジェクト指向、ジェネリック、命令型など広く対応しており、多目的に使用されています。