C++相談室 part153
■ このスレッドは過去ログ倉庫に格納されています
勉強するぞ!勉強するぞ!勉強するぞ! ↑ C++には似合わないような気が。 >>649 どういう意味だ? 1. C++erならそれくらい勉強せずに使いこなせ 2. あるがままを受け入れろ。状況を変えようとするな 3. Pythonを便利と言うな どれ? >>637 返信遅れて申し訳ありません、読んで色々試したら何となくですが理由見えてきました 一番為になった回答です…本当にありがとうございました >>652 結局のところ何がわからなかったのか言葉にしてくれんともやもやするんやが……。 最近ずぶの素人にいきなりSTL教えたりする変な風潮、変なサイトが増えたせいで こういうとこで初心者が苦労するんだよなぁ ライブラリの使い方なんか、初心者がいきなりぶつかる"壁"であってはならんと思うんだが・・ 先に言語自体の基本を学んでれば、>>634 はここに聞きに来なくて済んでるはず C++11以降はSTL前提で学んだほうが理解しやすい そんなの意識する必要ない。"STL"なんて定義曖昧な言葉を使わなければよい。 C++を使わなくてもSTLを学ぶほうが良い。 それどころか、およそ学問というものに携わる者はSTLを学ぶべきだ。 なぜなら20世紀における抽象化最大の功績だからだ。 STLは宇宙人が教えた説があるほどクレバー、クレバー、そしてクレバーだ。 ムーブセマンティクスも感動したなあ。 あいつら本物の天才だな。 まじ鱗ですよ。 unique_ptrとかthreadとかnumeric_limitsとかも"standard template library"だけどSTLとは呼ばれない よく理解してないC++アンチが何となく叩きの槍玉に上げる時に使われる用語っていう印象 >>634 pairが初期化子リストによるコンストラクタを持たないから c++ - emplace_back not working with std::vector<std::map<int, int>> - Stack Overflow https://stackoverflow.com/questions/33207232/emplace-back-not-working-with-stdvectorstdmapint-int?answertab=votes#tab-top 似たような質問があって、mapだと初期化子リストのコンストラクタがあるから、initializer_listを使って初期化出来てる この箇所あたりがそれ https://cpprefjp.github.io/reference/map/map/op_constructor.html map(initializer_list<value_type> init, const Allocator& alloc); // (11) C++14 から https://cpprefjp.github.io/reference/utility/pair/op_constructor.html pairのコンストラクタにはinitializer_listは出てこない >>669 単純にemplace_backはコンストラクタに渡す引数を、push_backは生成済みの実体を受け取るという違いを >>634 が分かってないだけだろ ついでに言えば、pairにinitializer_listを受け取るコンストラクタがあっても emplaceは可変長テンプレート引数だから、推定に失敗してどっちにしてもエラーになる 多分。 visual studio 2019でstd::filesystemを使いたいのですが、namespace"std"にfilesystemがありませんと言われます ググた通りにC++言語標準をC++17にしても変わりません どうすればいいですか? 上の方に #include<filesystem> と書く >>671 // cl 671.cpp /EHsc /std:c++17 #include <filesystem> #include <iostream> using namespace std; using namespace std::filesystem; int main() { directory_iterator d(current_path()); for(auto&& e : d) cout << e.path() << endl; } 全く問題なく動くぞ cl.exeのバージョンは19.28.29334 for x64 >>671 脱線の話だがappleのclangでfilesystem使おうと思ったら、 OSを10.15以降にしないと動かない上にビルドしたバイナリもそれ以降。 macだとintel版はhomebrewでgcc落としてビルドすれば旧いのでも動く。 日本語などのファイル名の扱いは、自分の試した範囲で、mac,linux,winで微妙に違ってた。 「wstring」、「stringでutf-8」のどっちかしか出来ん処理系があって、 複数機種用のコードは結局ifdefで分けるしかなかった。 そのうちライブラリが整備されるとは思うけど。 しかし「ハ゜」→「パ」のmacの仕様には参った。 RSSなんてもう誰も使ってないだろ フィードしてるサイトなんてありゅ? ブログホスティングサイトの系統だと RSS を提供してないところとかあんまりないと思うが。 ていうかあちこちの言語スレで同じ事聞くのやめなさい std::vectorのメンバ関数にfind()とかrfind()がないのはなんでですかね? string::find()みたいにあってもよさそうな気がするんですが・・・ >>682 よう知らんけど、vector固有でなくても使えるアルゴリズムだからでは? >>682 #include <algorithm>のfind()を使えってことだ 何でもかんでもメンバに突っ込むのは悪い設計だからだ この意味でstring::findは蛇足ともいえる 現実にはstring::findはiteratorではなくsize_typeを返すので 複数の文字列の同じ位置、のようなことがやりやすい UTF8とかだと単純に同じバイト値探せばいいわけじゃないからstringは特殊化してるんだよ >何でもかんでもメンバに突っ込むのは悪い設計だからだ こういう考え方いかにもCから入りましたって感じだな UTF-16(wchar_t)と違ってUTF-8(char)なら同じバイト列を探せばいいんじゃないの? ASCIIと同じコーディングで済むのがUTF-8が普及した要因だと思ってた >>687 短い系列は特に、部分列が一致したからといっても、 デコードした時にその文字かどうかは保証出来ないんじゃ? std::stringってバイト単位で扱うものでしょ 本当に文字単位で扱いたいならstd::wstring >>686 kwskしていいか? それともやめとくか? >>689 wstringだろうがu16stringだろうがu32stringだろうが状況変わらんぞ >>690 質問主ですが、是非ともkwskしてくだしあ utf16はサロゲートペアちょんぎらないようにしないとな 合字とか異体字セレクタとかもな 文字を扱うというのは大変なんだ >>688 1バイト目とそれ以降は重ならないからそういうことは起こらないはず そもそもstring::findがあるのは文字列から文字列を探す需要が高いからじゃないですかね vector含む各コンテナから探すのはほとんどの場合要素単位だから汎用的なstd::findを使えということと解釈 >>696 だよね std::stringのfindは要素を探すんじゃなくて、 要素(char)の連なり=部分文字列を探すもので vectorとかのコンテナのそれとは異質だし蛇足とは思えない まぁ汎用的というか、stlのアルゴリズムはほとんどが全コンテナに対して共通のコードに出来るからそうしてる(グローバルな関数にしてる)んじゃないかね 実際問題、共通のインターフェースを継承によって表現するのでない限り、同じコードをあちこちメンバ関数にするのは不自然 逆に共通のインターフェースにすべきクラスの機能を無理に普通の関数にするのも馬鹿げてる データ構造とアルゴリズムを合わせたものがクラスでありオブジェクト指向言語の特徴の1つと教わった いまは汎用アルゴリズムが再び外部に分離されるようになってきてるのかな テンプレート・ジェネリクス・インターフェースのおかげかな? 型Tに対する操作を外部化しておいたほうが汎用的で型Tを実装するすべてのクラスが操作を個別に持つのは無駄ってことか beginとendをペアで指定しないといけないポインタ的iteratorのせいで外部化せざるを得なかったという方が正しいんじゃないですかね ↓のサイトでも外人が同じ議論してるね 誰か要約してください https://stackoverrun.com/ja/q/4020758 Why does std::string have a find member function while std::vector and friends don't have it? Is there anything wrong with using std::find on the string? >>701 オブジェクト指向にも種類がある。 ただひとつのオブジェクト指向がオブジェクト指向たる基準があるわけではなくて、 わりとふんわりした概念だよ……。 C++ の場合はカプセル化に軸があると思う。 隠されていないデータを処理する分にはメンバ関数にする必然性がない。 抜け道があるかって意味なら、java等もカプセル化できないってことになるけど >>701 そういうことじゃねえよ データ構造とアルゴリズムごちゃ混ぜにしたのをクラスと言い張る意味はない 1つの目的のためのお膳立てを揃えたものがオブジェクトでオブジェクトの種類がクラスだ C++標準のライブラリではデータ構造はコンテナ、アルゴリズムは関数テンプレートとして分離されている コンテナは配列やリストといったデータ構造を提供するまでにとどめ それらを使って何かする応用までメンバにはせず関数テンプレートにしてある >>706 Javaのリフレクションで何でも呼べる抜け道みたいな話ではなく C++ってヘッダーファイルにprivateメンバー書かないといけないじゃん そのせいで内部実装が変わったらライブラリ利用者にヘッダーファイルを差し替えてもらわないといけなかったりする これってカプセル化できてないってことじゃない? pimplとかテクニックがあるけどさ >>708 古い知識ですまんが、素直に抽象基底クラス被せるでだめなん? なる。 そういうことならpmplかインターフェースクラスを定義するかしか思い浮かばないな > 内部実装が変わったらライブラリ利用者にヘッダーファイルを差し替えてもらわないと これ、そんなに深刻な問題か? ライブラリの更新なんてリポジトリ決めてバージョン管理して あとは勝手に落とせで運用できてるやん 現実的な部分では運用でなんとかしてる部分はあるのも確かだが、 現実に対する妥協なのでパラダイム的な話とは区別が必要じゃない? まあ不可分なところもあるんで微妙な話ではあるけども。 >>708 それってモジュール使えば解決できる問題じゃないんでしたっけ >>712 運用できていても、いささかでも無理があれば まだ余裕があるうちでも将来を見据えて 議論する価値が出てくるね 問題は無理を全く感じていないことを 空想論的に問題視することだ 個人的に問題視するのは勝手だが 他人が付き合ってくれないときにしつこくすることだ C++はゼロコストで極力あらゆる制御をプログラマーに与えることを 使命ていうか至上命題にして至高のレーゾンデートルとみなしているように見えるので プログラミングパラダイムを論じるにはいまいちに思はるる、 やっぱヘッダファイルとか批判者にとってかっこうの餌食でありその光景がまさに展開された、 きちんとオブジェクト指向するんなら継承は全部virtualであるべきや といってもC++だけにあてはまる批判ではないが Base::Foo()とDerived::Foo()が異なる振る舞いで定義されているときに、 func(Base&)にDerivedを渡したらfunc()の中ではBase::Foo()が呼ばれるとか 危険極まりない この基準で言ったらたいていの似非オブジェクト指向言語はNG クラスベースオブジェクト指向はすべて似非オブジェクト指向 アランケイ「C++のオブジェクト指向?知らない子ですね…」 >>716 >C++はゼロコストで極力あらゆる制御をプログラマーに与えることを >使命ていうか至上命題にして至高のレーゾンデートルとみなしているように見えるので 半分は正しいがそれならcでええやんてなる。 c++のc++たる所以(もしくは厨受けするところ)ってのは、ゼロコストなのにさらにどんなに高級な機能も入れられるんやで〜ってところだろ。 >>717 え、その場合仮想関数ならDerived::Fooやろ? 非仮想とか値渡しならそうだけど 非仮想だとそうなっちゃうっていう批判なんだろ ハイディングなんかする方が悪いと思うけど >>717 仮想継承の話かと思ったら そうじゃないようだな >>720 「使った機能にあったコスト」だよ。 ゼロコストはあくまで機能を使わなかった場合の話。 cの機能しか使わなかったらcのコストしかかからないのが基本方針だろ。 >>722 あぁそういうことか・・ ちょっと自分の常識からかけ離れてるから理解できんかった #include <charconv> using namespace std; int main() { char str[] = "123"; double dbl; from_chars(str, str + 3, dbl); } Visual Studioでは通るんだけど、GCCではダメ どうも戻りのfrom_chars_resultがテンプレートになってて推論に失敗してるようなんだけど 規格ドラフト見てもfrom_chars_resultがテンプレートだなんてどこにも書いてない これGCCがおかしいんだよな? バグレポ上がってたりする? バージョン書き忘れた Visual Studio: 19.28.29334 GCC: 10.2.0 >>728 23.20.1 Header <charconv> synopsisにはfloat, double, long doubleが挙がってるんだけど・・・ ああ、GCCがってことねthx gccの傾向として、熱烈な信者がいて、出来ないことを出来ると宣伝したり、劣っているものを優れていると宣伝したりする場合がある。 ところが、そのような場合、GNUのマニュアルは「出来ない」「劣る」と明言している場合が多い。 したがって、gccについてはみだりに検索せず、GNUのサイトを見ることをお勧めします。 >>726 「ダメ」がコンパイルエラーの意味ならエラーメッセージも挙げてよ。 継承使うと密結合になり変更に弱くなるし(実行時のオーバーヘッドにもなりそう) 規約で縛るというSTLの実装には好感が持てる >>731 W:\>g++ g1.cpp g1.cpp: In function 'int main()': g1.cpp:8:33: error: no matching function for call to 'from_chars(char [4], char*, double&)' 8 | from_chars(str, str + 3, dbl); | ^ In file included from g1.cpp:1: C:/msys64/mingw32/include/c++/10.2.0/charconv:595:5: note: candidate: 'template<class _Tp> std::__detail::__integer_from_chars_result_type<_Tp> std::from_chars(const char*, const char*, _Tp&, int)' 595 | from_chars(const char* __first, const char* __last, _Tp& __value, | ^~~~~~~~~~ C:/msys64/mingw32/include/c++/10.2.0/charconv:595:5: note: template argument deduction/substitution failed: In file included from C:/msys64/mingw32/include/c++/10.2.0/charconv:40, from g1.cpp:1: C:/msys64/mingw32/include/c++/10.2.0/type_traits: In substitution of 'template<bool _Cond, class _Tp> using enable_if_t = typename std::enable_if::type [with bool _Cond = false; _Tp = std::from_chars_result]': まだまだ延々続くけど、こんくらいでいい? >>727 vsでも2017update7は同様のエラーみたいだなぁ n要素のvectorをm要素に変えたいときって中身はどうでも良いって思ってれば vec = vector<int>(m); も vec.assign(m); も vec.resize(m); もコスト変わらない? >>737 何がしたいの? 元ソース貼ってるからそっちでコピペして 手元のGCCでコンパイルしてみれば再現するはずだよ >>729 gccではMLで夏くらいにfloat版の実装のコミットの話が出てたから次のリリースでは多分実装されてるんじゃないかな。 >>729 23.20.1がHeader <charconv>のドラフトってどれだ? https://cpprefjp.github.io/reference/charconv.html https://cpprefjp.github.io/reference/charconv/from_chars.html webページ見れない理由あった? >GCC: 8.0(整数のみ) >Visual C++: 2017 update 7(整数のみ), update 9(full support) 俺ならこの二つ眺めて「GCCは未実装なんだなぁ」と思考停止して終わる >>747 そうか、思考停止するのか よかったね 何だか色々と前提置いてるけど 俺は知らんよ、おまえさんの前提なんぞ イヤミ口調のくせに脇が甘いな priority_queue<int>に比較関数を指定したいとき、 priority_queue<int, vector<int>, greater<int>> のようにすると思いますが、内部コンテナ vector<int> は別にデフォルトのままで良いし書くのが面倒なので省略したいです 可能ですか? ■ このスレッドは過去ログ倉庫に格納されています
read.cgi ver 07.5.4 2024/05/19 Walang Kapalit ★ | Donguri System Team 5ちゃんねる