Top 8
Outer WildsストーリーMODを色々やってみた
June 18, 2023, 10:04 a.m.表面符号と戯れる【量子コンピューター Advent Calendar 2023 23 日目】
Dec. 23, 2023, 3:28 a.m.位数発見アルゴリズム ~Quantum Zooやっていく【特別編】~
Jan. 27, 2023, 2:50 p.m.ストーリー追加 Mod: The Outsider やっていく日記【Outer Wilds】
Feb. 19, 2023, 6:33 a.m.意識が量子効果で生じることを示す実験結果についてちょっと調べただけのメモ
April 21, 2022, 3:09 p.m.ストーリー追加 MOD: Astral Codec やっていく日記【Outer Wilds】
Feb. 25, 2024, 8:47 a.m.Outer Wilds の量子は計算能力が(ある程度)すごいのではという話
Jan. 15, 2022, 8:35 a.m.MacでAge of Empires 2 DE (AoE2DE)をCrossOverで動かす
May 31, 2021, 11:52 a.m.C++で単純なPythonのenumerateを作ってみる
Sept. 9, 2019, 1:05 a.m. edited Sept. 9, 2019, 2:40 a.m.C++ガチ勢の書いたenumerateは
http://pushl.hatenablog.com/entry/2013/12/13/053711
http://reedbeta.com/blog/python-like-enumerate-in-cpp17/
https://cpplover.blogspot.com/2017/10/range-based-for.html
https://cpplover.blogspot.com/2017/10/range-based-forif-constexpr.html
とかを見ると良いと思う.
##########
以下は誰でもわかる簡単なもの.効率も悪い.
C++には範囲for文 (range-based for) があり,これを使うと
int main() {
std::vector<std::string> values = {"hoge", "foo", "bar"};
for(auto&& value : values) {
std::cout << value << std::endl;
}
return 0;
}
と書けて,インデックスを使った場合に起こりうる範囲外アクセスの危険性がなくなる(ちなみにauto&&
についてはここに説明があった).ここで,Pythonでも同じように
values = ['hoge', 'foo', 'bar']
for value in values:
print(value)
と書くことができる.Rustなどでもインデックスを使わないforが一般的なので,今はこちらの方が主流なのかもしれない.
ところで,それでもやはりインデックスが欲しくなるときはある.例えば,見ている要素が奇数番目なのかが必要になるときなど色々ある.こういうときPythonでは,
values = ['hoge', 'foo', 'bar']
for i, value in enumerate(values):
print(f'{i}: {value}')
というようにenumerate
を使ってインデックスと中身の両方をforで得ることができる.
しかし,C++にはenumerate
は残念ながらないので,これを実装したいというのが今回の目的である.最初に申し上げたように実用的で効率的なコードは本稿の一番上に羅列した記事を見るのが良い.ここでは,誰でもわかる単純な方法でやってみるというものである.
まず,forでコンテナから2つの変数へ持ってくることは構造化束縛を使うとできる.具体的には,
int main() {
std::vector<std::tuple<size_t, std::string>> values = {
{0, "hoge"}, {1, "foo"}, {2, "bar"},
};
for(auto&& [i, value] : values) {
std::cout << i << ": " << value << std::endl;
}
return 0;
}
という書き方ができる.したがって,values
の中身をインデックスを持つtuple
にするenumerate
を作れば良いということになる.
それでは,シンプルにenumerate
関数を書いてみる.
std::vector<std::tuple<size_t, std::string>> enumerate(const std::vector<std::string>& values) {
auto length = values.size();
auto values_with_indices = std::vector<std::tuple<size_t, std::string>>(length);
for(size_t i = 0; i < length; ++i) {
values_with_indices[i] = std::make_tuple(i, values[i]);
}
return values_with_indices;
}
あまりに愚直であるが,これで
int main() {
std::vector<std::string> values = {"hoge", "foo", "bar"};
for(auto&& [i, value] : enumerate(values)) {
std::cout << i << ": " << value << std::endl;
}
return 0;
}
と書くことができる.
さすがにstd::vector
の中身を任意のものにしたいので,template
を使って,
template<typename T>
std::vector<std::tuple<size_t, T>> enumerate(const std::vector<T>& values) {
auto length = values.size();
auto values_with_indices = std::vector<std::tuple<size_t, T>>(length);
for(size_t i = 0; i < length; ++i) {
values_with_indices[i] = std::make_tuple(i, values[i]);
}
return values_with_indices;
}
もっと任意のコンテナ(vector
, list
, ...)を渡せないのか?
template<template<typename T> class Container, typename E>
Container<std::tuple<size_t, E>> enumerate(const Container<E>& values) {
auto length = values.size();
auto values_with_indices = Container<std::tuple<size_t, E>>(length);
size_t i = 0;
std::transform(values.begin(), values.end(), values_with_indices.begin(), <a href="auto& value" target="_blank" rel="noopener">&</a>{return std::make_tuple(i++, value);});
return values_with_indices;
}
とりあえず,これで終わり.
Top 8
Outer WildsストーリーMODを色々やってみた
June 18, 2023, 10:04 a.m.表面符号と戯れる【量子コンピューター Advent Calendar 2023 23 日目】
Dec. 23, 2023, 3:28 a.m.位数発見アルゴリズム ~Quantum Zooやっていく【特別編】~
Jan. 27, 2023, 2:50 p.m.ストーリー追加 Mod: The Outsider やっていく日記【Outer Wilds】
Feb. 19, 2023, 6:33 a.m.意識が量子効果で生じることを示す実験結果についてちょっと調べただけのメモ
April 21, 2022, 3:09 p.m.ストーリー追加 MOD: Astral Codec やっていく日記【Outer Wilds】
Feb. 25, 2024, 8:47 a.m.Outer Wilds の量子は計算能力が(ある程度)すごいのではという話
Jan. 15, 2022, 8:35 a.m.MacでAge of Empires 2 DE (AoE2DE)をCrossOverで動かす
May 31, 2021, 11:52 a.m.Tags
- #Python (26)
- #量子力学 (25)
- #量子情報 (23)
- #Unity (11)
- #Outer Wilds (11)
- #数学 (9)
- #Mac (9)
- #AoE2 (8)
- #Linux (7)
- #Quantum Zoo (6)
- #意識 (5)
- #シミュレーション (5)
- #NumPy (5)
- #Bash (5)
- #相対論 (4)
- #Docker (4)
- #Android (4)
- #Qiskit (4)
- #Rust (3)
- #PyO3 (3)
- #GitHub (3)
- #Django (2)
- #情報理論 (2)
- #LaTeX (2)
- #AR (2)
- #Git (2)
- #iOS (2)
- #C++ (2)
- #正規表現 (2)
- #論文 (2)
- #電磁気学 (1)
- #Google Drive (1)
- #Overleaf (1)
- #Let's Encrypt (1)
- #ポケモン (1)
- #AdMob (1)
- #Autoya (1)
- #docopt (1)
- #SymPy (1)
- #AWS (1)
- #Twitter (1)
- #URP (1)
- #iMovie (1)
- #PyTorch (1)
- #C# (1)
- #Vim (1)