人形の国。
いや、髪を切られてしまうイレイナもかなりうかつですが……。
かなり濃いキャラのシーラですが、サヤの師匠だったのね。
今回は人形が気持ち悪い回かと思ったら、それを作ってる人がものすごく気持ち悪いのでした。
神椿の春猿火のカヴァー。
最初のころはラップ調の曲がメインだったのですが、最近は違う感じの曲もうたうようになってきましたね。
不可解のときのライブ映像みたいで。
いや、やっぱり花譜と理芽の声の違いがわかりにくい。
同時に歌ってるからもっと差がついててもおかしくないのに。最初の方はどっちが歌ってるかわからなかった。
あえて言うなら、花譜の方が声がひしゃげてて、理芽の方がやや素直な声になってる。
神椿の花譜と理芽でした。
perlの方がC++よりも親しんできたので最近おぼえはじめた C++ が不便でたまらないところがありました。
そのうちのひとつが配列のサイズ。
まぁ、Fortranでもそうですが、古典的には必要とされるより大きい数の配列を宣言しておいて、その一部を使うというものなのですが、この数が不明のときには不便で。
これまたよく使う連結リストはメモリの配置がばらばらになりやすく遅くなりがちとのこと。
でもリストの後ろにがんがん追加していけるのは便利。perl なら配列の最後にpushで要素を追加することができますからね。
というわけでC++の標準ライブラリにある連結リストの std::list を調べていたのですが、何のことはない、std::vector を使えば比較的高速に動かすことができるようで。(メモリは配列よりも食うらしいですが。)
listの場合は途中で切った貼ったができるのですが、なにかのデータを読み込んでいって後ろに要素を足していくだけならvectorで充分じゃん。
ということで使い方の練習ということで。
#include <cstdint>
#include <cstdio>
#include <vector>
int main(void) {
std::vector<int32_t> datas;
for (int32_t i = 0; i < 10; i++) {
datas.push_back(i);
}
printf("number of elements: %d\n", datas.size());
printf("first element:%d\n", datas.front());
printf("last element: %d\n", datas.back());
printf("two type of loop\n");
for (int32_t i = 0; i < datas.size(); i++) {
printf(" %d", datas[i]);
}
printf("\n");
for (int32_t x : datas) {
printf(" %d", x);
}
}
こいつを g++ なり clang++ でコンパイルして実行。
number of elements: 10
first element:0
last element: 9
two type of loop
0 1 2 3 4 5 6 7 8 9
0 1 2 3 4 5 6 7 8 9
いや、本当、今更なんでしょうね。
最初のforのところをファイルからEOFまでループさせておけば、ファイルのレコード数分データがvectorにたくわえられるわけで。
例では int32_t のベクターにしたけど、構造体 T に対して std::vector<T> datas; とでもしておけば構造体のベクターができて、ループで構造体を取り出すことができる、と。
size を使ったり、そもそも for(int32_t x:datas)みたいなループを使えば要素の数を気にせずにループしてデータを取ってくることができる、と。
あえてstreamを使わないで printf を使ってるので、C++っぽくないのですが……。。