C++でvectorをcoutする

はじめに

みなさん vector 使ってますか。vector いいですよね。
この vector の中身を見たいとき、1つずつ cout すればいいわけですが、なんとなくしっくり来ない。
なので、vector を前後に波括弧つけて、数字の間にカンマを入れた string に変換する関数を作りました。

プログラム

関数の名前は formatVecInt2Str です。
vector を string に format する、と言う意味の名前です。

#include <bits/stdc++.h>
using namespace std;

string formatVecInt2Str(vector<int> vec){
    string str = "";
    str +="{";
    bool isFirst = true;
    for (auto item : vec){
        if(!isFirst) str += ", ";
        str += to_string(item);
        isFirst = false;
    };
    str += "}";
    return str;
}

int main(){
    vector<int> vec = {1,2,3,4,5,6};
    string str;
    str = formatVecInt2Str(vec);
    cout << str << endl;
}

アウトプット

{1, 2, 3, 4, 5, 6}

解説

main で str = formatVecInt2Str(vec); とすると、str に vector の中身がフォーマットされた状態で文字列として格納されるので、あとはそれを cout する。
関数 formatVecInt2Str は項目を to_string で文字列にして str に付け足しているのですが、前後に波括弧と数字の間にカンマを入れて、余計なカンマが入らないようにコントロールしたりしています。

qiita の記事を参考にしました。

以上

ウクライナと東京大空襲(頭の体操)

シカゴ大学政治学ミアシャイマー教授がウクライナ戦争について語っています。

世界的な米国際政治学者・ジョン・ミアシャイマーウクライナ戦争を起こした責任はアメリカにある!」【日本語字幕付き】 https://www.youtube.com/watch?v=cZaG81NUWCs

ウクライナだけはNATOに入ることは許さないと何度もプーチンは言っていたのにその方向にどんどん進めてきたことが今回の戦争の原因と言っています。

2008年からの話なのでブッシュ時代からですね。ミアシャイマーは、現実主義者なので、始まってしまった以上しょうがない。お互いに掛け金を上げ続けるしかない、と言っている。解決策はないみたい。

話の途中で東京大空襲や広島長崎の話が出てくるのですが文脈がわかりにくい。

私の理解では、アメリカですら勝っていた戦争で硫黄島・沖縄の戦いのあと日本占領のためには膨大な数の米兵の犠牲を覚悟しなければいけないと恐怖に震えてその結果東京大空襲や原爆投下になった。それを考えればどんなことをしてでもロシアはウクライナNATO配下にはしないだろう、と言っている。

東京大空襲についてそんな風に考えたことがなかったので新鮮でした。

いやしかし、その論理では今回はロシアがウクライナに勝って和平交渉ということでそれはアメリカが許さないでしょう。すぐには無理でも、アフガニスタンは20年、シリアは10年、かけてアメリカが負けたわけだから同じような話になるのかもしれない。

うむ。わからん。

ウクライナと第三次世界大戦(頭の体操)

こうやって第一次世界大戦は始まったのかなぁ、と感じてたけどそれは違うかも。さすが第三次世界大戦が始まってしまったらイギリスもアメリカも反省するだろうから、だからウクライナは助けてあげるから自分で戦いなさい、と言うスタンスなのだろう。それはそれで相当無責任だと思うが。

第一次世界大戦サラエボでなにかあって小さな戦争が始まってそれが世界を巻き込んで、と高校の歴史で習った。フランスやイギリスでは今でもあの戦争とか大戦争と言えば第一次世界大戦の事で第二次世界大戦の事ではない、と言うのも聞いたことがある。それぞれの国にとっての犠牲者数が第一次世界大戦の方が大きかったとか。ホントかしら。

さて、第二次世界大戦の方ですが、イギリスのドラマを見ていたら第二次世界大戦はイギリスとフランスがドイツに宣戦布告した事で始まったのですね。ちょっとびっくり。てっきりドイツが宣戦布告したかフランスに攻め込んだのが始まりと思っていた。そう言えば高校教科書でドイツがポーランドに進撃し、フランス・ドイツが宣戦布告して始まったと書いてある。ふむ。嘘はついていないけどわざと誤魔化していると思う。あと、昔の教科書はポーランドの東半分をソ連が取ったことが付随的にしか書いていない。時代ですね。

ゼレンスキーが停戦交渉がうまくいかなければ第三次世界大戦になる、と言っている。 世界がウクライナを見捨てるならば覚悟がある、と言うことなのだろうか。いや、ロシアに対してウクライナには世界がついているぞ、と言っているのだろう。とは言え、イギリスの首相とアメリカの大統領は少し背筋がゾッとしたかもしれない。

原爆が出来て以来相互確証破壊で世界大戦は起きなくなった、と言われているが、それは双方が理性的か、少なくとも片方が理性的で相手の狂気を我慢出来るという状況でないとダメだよね。

ラノベ幼女戦記の世界ではドイツみたいな架空の国が魔法のある世界で第一次世界大戦第二次世界大戦を合わせたような戦争を戦っていて、最終的には跡形もなく滅びる。1つ1つの戦いは勝つのだけれど、選択肢がないまま戦線が拡大して行くのが痛々しく書かれている。プーチンがどこかで選択肢がない、と言っていたので思い出しました。

いろんなシナリオが考えられるけど、日本を含む西側世界がウクライナ支援を続けて、ウクライナの戦況がウクライナ有利になったら、ロシアは爆撃のレベルを上げて行く。戦術核を使うかもしれない。キエフが瓦礫になるかもしれない。そうならないようにウクライナはロシアに直接ミサイルを飛ばす。世界戦争にはならないけれど、ウクライナとロシアの全面戦争で、どちらかがリソースの尽きるまでとなるか。ちょっと危険すぎる。

朝鮮戦争みたいにどこかで線を引いて仮の停戦になってそれで固定するしかないのかなぁ。ととりあえず思っています。

C++ 文字列を任意の回数繰り返す無名関数

最近 C++ を齧り始めました

C++ で char を繰り返す関数はあるのですが、文字列を繰り返す関数が見つからなかったので無名関数で出来ないか考えました。

#include <bits/stdc++.h>
using namespace std;

int main() {
  string str;
  str = "abc";
  int n = 3;
  auto tempfunc = [](int x, string a){string acc=""; for(int i =0;i < x; i++) acc += a; return acc; };

  cout << tempfunc(3,str) << endl;
  cout <<  [](int x, string a){string acc=""; for(int i =0;i < x; i++) acc += a; return acc; }(4,"defg") << endl;

}

アウトプットは

abcabcabc
defgdefgdefgdefg

となりました。

基本は [](){}() なので意外に覚えやすい。[] が無名関数が始まりますよー、という合図で本体は {} の中。2番目と最後の括弧 () が変数(引数)を扱う場所。本体の中で戻り値を return で指定できるので、関数言語のように関数の受け渡しが出来る。

と言う理解であってるかな?

あ、ぜんぜん違うね。上の例では無名関数の戻り値を使っているだけで関数を受け渡しているわけではない。もう少し実験すればわかるかもしれないけど、まだそのレベルでないのでいまはここまで。

ロシアと中国の共通言語・共通通貨

頭の体操です。

通貨

仮に今後ロシアと中国でブロック経済圏を作る世界が来るとして、共通通貨はドル以外にするだろうから、人民元になるのかなぁ。それによって得られる中国の覇権の魅力があるので、そうするとは思うものの、経済政策が自由にならなくなることを嫌がるかもしれない。北朝鮮やイランがブロック内に取り込まれて、それらの国の経済状況に責任を持つのは難しいだろう。

今までだってアメリカが責任持ってくれていたわけではないが、それなりに世界の繁栄が続いたのはドル基軸通貨のおかげだと思う。

ビットコインなどのデジタル通貨でデジタル通貨が瞬時に決済できる利点を利用して多通貨ブロック圏にすることは出来るだろうか。それでもメインの通貨は必要だろうから、デジタル通貨プラス人民元。マーケットに自由に任せるとドルの優位性を崩せない。デジタル人民元で中国がコントロールしながら行くことになるのではないか。

言語

ロシア人と中国人は何語でしゃべるか。共通言語は今は多分英語だと思われます。英語は必ずしも易しい言語ではなく、ロシア語と中国語は必ずしも難しい言語ではないので、実務上次第に中国語が共通言語になって行くだろう。50年くらいしたら世界が中国語ブロックと英語ブロックに別れているかもしれない。

ロシアの科学者や数学者はユダヤ人だろう、と思いがちで、中国だって宇宙ロケットを飛ばしているくらいだから科学者や数学者はたくさんいるだろう、と思いがちだが、歴史的に見てやはりロシアの優位性は否定し難く、その根底にロシア語があると思うので言語的にロシアが中国語化されるのは長い目で見ての生産性を下げることになると思う。まそう簡単にはなくならないので心配するのはやめよう。

中国が国際言語になるきっかけになれば良いと思う。

江戸時代の朝鮮使節との会話は基本的に漢字による筆談だったし、300年続いた大清帝国の言語は官話、マンダリン、と呼ばれるくらいで共通言語としての側面があったと思う。中国人が共通言語を喋っていたというのは幻想で、国際言語、共通語、リンガ・フランカだったのだからそこに戻そう。

ウクライナ。今の考え。

記録のために今の考えを書いて置く。消すかも知れない。

この戦争は泥沼になって、ロシアは経済封鎖と軍事費負担に耐えきれず滅ぶ。というのが2ちゃんねるひろゆきの見立て。

私の見立ては泥沼になって経済的にも泥沼が続いて長期化して徐々に世界は2分化して行く。世界戦争を避けるために西側は譲歩するしかないだろう。

と言うよりなにより科学の進歩が続くのでどうなるかわからない。

ロシアの次が中国なのはほぼ確実なので中国は安易にロシア制裁に加わらないし、ロシアの味方をして制裁を受けるわけには行かない。とりあえずはぬらりくらりするしかない。流れを読んでいる所だと思う。

ロシアが滅ぶ時点で中国に助けを求めて、中国がロシアを属国にするのが多分中国にとって最善の方法になると思うがどうか。

ロシアやウクライナは極貧国なのでどちらもそう長くは持たない、と言うのは間違いではないが、ソ連崩壊の後の混乱を乗り切って来ているので侮れないと思う。そもそもあの時助けてあげなければいけなかった。

SWIFT からの排除は基軸通貨ドルの体制からロシアを排除することであり、アメリカを支えているのはドルが基軸通貨であることで無限に借金が出来る体制なので、そこらの排除で相手の経済を瞬時に潰すことが成功しなかったことの意味は大きいと思う。デジタル通貨経由で通貨交換する世界になるとアメリカの優位性は崩れる。

読書感想: 土偶を読む

トンデモ本として紹介されていて、噂は聞いていたのですが、最近図書館で借りて読みました。

竹倉史人著 「土偶を読む」

内容は

土偶のデザインは植物の形をデザインしたもの。

と言う主張です。

これだけだとなんの根拠があって、と思うかも知れませんが、しばらく前に

「ドングリと文明」 ウィリアム・ブライアント・ローガン

という本を読んでいて、これの主張は

1万5000年前氷河期が終わってから人類は木の実を食べる時代に入り森の周辺に定住し、そこで農耕栽培を始める。

というものでした。

「ドングリと文明」の本には日本の縄文時代への言及はなくてその他の世界の話で、一方「土偶を読む」に世界がそういう時代だったという前提がないので、それぞれもう一歩説得力に欠けるけれど並べて読むと絶対これが真実、という気がしてくる。

ドングリは一シーズンで数年分、膨大な量を集めることが出来るというのは多分子供の頃山でドングリを拾ったことのある人は、そうかも、と思うと思う。子供の感覚としては無限に落ちているよね。

詳しい事はそれぞれの本を読んで欲しい。この記事で言いたいのはそれぞれが言及していないのが残念、ということと、多分真実なのにトンデモ本として葬り去られていくのだろうなぁ、という感想でした。