C++相談室 part131 [無断転載禁止]©2ch.net
■ このスレッドは過去ログ倉庫に格納されています
次スレを立てる時は本文の1行目に以下を追加して下さい
!extend:on:vvvvv:1000:512
C++に関する質問やら話題やらはこちらへどうぞ。
ただし質問の前にはFAQに一通り目を通してください。
IDE (VC++など)などの使い方の質問はその開発環境のスレにお願いします。
前スレ
C++相談室 part130
http://mevius.2ch.net/test/read.cgi/tech/1490917669/
このスレもよろしくね。
【初心者歓迎】C/C++室 Ver.100【環境依存OK】
http://echo.2ch.net/test/read.cgi/tech/1478440682/
■長いソースを貼るときはここへ。■
http://codepad.org/
https://ideone.com/
[C++ FAQ]
https://isocpp.org/wiki/faq/
http://www.bohyoh.com/CandCPP/FAQ/ (日本語)
-
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured
VIPQ2_EXTDAT: default:vvvvv:1000:512:----: EXT was configured >>415
通常のループも、二重ループもあらかじめ用意した配列でなら書けます
動的配列になるとiteratorの使い方が分からずプログラムが動かなくなってしまうのですが笑
>>416
ありがとうございます使ってみます! >>419
つまり分からないのはイテレータのループそのもので、二重ループは関係ないということかな? perlのfor my $elem (@array){をやるのに何年懸ったんだろうといつも思う >>420
そんなかんじですね
たとえば、x[i+1]をiteratorのループではどう表現するのかとかそういうのが分からないとかです イテレータは繰り返しを前提としているので基本的に進むと戻るの操作しか提供しない。ランダムアクセスっていうのもなくはないけどね。
it++で前進、it--で後退。操作して、Container.begin()と同じ値なら先頭を、Continer.end()と同じ値になったらそのコンテナの末端を指している。
基本的にはポインタを抽象化したものだからポインタの操作を思い出すと少しわかりが早い。 >>422
君には早いのでまずはポインタでぐぐってくれ
x[i + 1] == *(x + i + 1) ポインタではループ書けませんって
なんかつき合う気失せるぐらい初心者やね
いやアンタが悪い訳じゃないんやが >>419
それ、end()が何を返しているかとか、
連続領域でないのにポインタを返しているとか
そういう系の問題じゃね?
あと「イテレータのループ」というのが
range-based-forだったりすると
x[i+1]はそもそも無理だぞ みなさんありがとうございます!
もっと勉強して出直してきます Cとjavaの基礎やったから基本の文法とオブジェクト指向の触りみたいな部分だけわかるんだけどこの状態でテンプレートとかの勉強初めていいの?
あそこらへん急に難しくなるイメージあるけど他に先にやるべきこととかあります?
あとそういう人におぬぬめの本とかもしあったら教えてくだされ >>428
まずテンプレートライブラリの使用方法を重点的に
自分でテンプレートを書くのは後回しにしたほうがよい >x[i + 1] == *(x + i + 1)
はて、いったい何の言語の話だろうか >>424
ポインタを意識させないのがイテレターだろうに
>>430
左辺と右辺が同じだって事が言いたいんだろうけど...
上に書いた理由でトンチンカンと言わざるを得ない >>422
it_next = it;
it_next ++;
とか >>432
意味がわからない
もう少しわかりやすく頼む
出来ないならもう発言しなくて良いから なぜにイテレータでやろうとするのか
valarray使えばこんなの即効だろ あのー、このスレに限らずどこもなんだけどさ、
初心者をケナスくせは、やめた方が良いよ。
ちょっと知ってる者の傾向だね。
ちょっと自分が物事を知ってるから、
「自分らが、上だ。と、知らない者をけなす癖」が多大に有るよね。
本当に知ってる者は、初心者にもやさしく教えてあげるよ。 >>432
>左辺と右辺が同じ
少なくともここはC++のスレで、C++では同じでないのだが何を言ってるんだお前は 知らない者を貶す気はないけど知ったかの頓珍漢な指摘は全力でバカにする また規格に自信ある奴が日本語読めてないな
日本語の文脈を理解できるようになってから発言してくれ >>437
C++でいつでも同じかなんてことはどうでも良い
レス自体トンチンカンなんだから 全くその通りだよね
ポインタ滅ぶべしとか思ってるのかも知れないけど、初心者はまずイテレータを理解してその後
ポインタを学べば良いなんてプロセスは効果的とは限らないし、個人的には無理があると思う。 C++使ってて初心者は隠蔽された中身を理解しなくていいとか本気で思ってる奴いるのかよ
それにイテレータはポインタのような操作ができるインターフェイスなのでポインタを理解してることは前提となっている 逆だよ。初心者は隠蔽された中身を理解しなくていい範囲と使うべき。
初心者に教えるときも注意しなきゃいかん。 >>443
イテレターを使う上で、ポインタを知らないと何が問題? 「あたかもポインタのように振る舞うオブジェクト」を使うにあたって
そもそもポインタを知らないことの何が問題か本気でわからないのか? イテレーターのコンセプト、理解してる?
ポインタのように振る舞う、じゃないよ。 イテレーションすることを目的にしてるけど、
ポインタもイテレータの機能を持ってるからポインタを想像するとわかりやすいっていうのはある。 >>447
どっかから引用したわけじゃないんで
そういうフレーズにはなってないだろうなあ
ポインタの使い方に、イテレータの使い方を似せてあるのは
誰の目にも明らかなんだが、おまえだけ違うのか?
重箱の隅でない説明がもしできるなら拝聴したいぜ ポインタに似せるというコンセプトではないので、ポインタと同じ構文で操作できてもポインタとは何の関係もありませ〜んwwww
そんな話してねえだろコミュ障か? イテレータの使い方がポインタの使い方に似せてある…?
もしかして、イテレータの意味わかってないんじゃないか?? >>451
はいはい
イテレータはポインタの操作方法と互換性がある
ただし静的配列やvectorで使われているランダムアクセスイテレータはすべての操作をサポートしているが、それ以外ではサポートしていない操作もあるので注意
とまで補足を入れたらいいんだろ
配列の話をしていたはずなのにアスペはすぐ話の腰折るから困る むしろ初心者ほど中身を知りたがるもの。
イテレータなんて実装が隠蔽されてるわけじゃなし、知った上で抽象化したらこうなるってのが妥当な方向だ。
コンパイラがやる最適化等とは別の話だ。 だいたいポインタの理解なんて義務教育レベルだしな。 >>450
初心者に教える、つう前提を無視するなよ。アホか?
なんで初心者にイテレーター教えるのにポインタが必要なんだよ。説明してみろ。 さあねえ
俺はポインタを知らんやつにイテレータを教えたことがない
それを馬鹿にしたければするがいい
じゃあ、あんたはどうやって教えたのか、こっちが聞きたい >>456
その場でイテレータを使うだけなら必要ないが、それでは何故か動くおまじないになるだけ
マンツーマンじゃあるまいし基礎を理解していない者に教えるのは疲れるし両者にとって不毛だ
複雑な実装のイテレータを理解しろともコンピュータの仕組みを理解しろとも言ってないし
キーワードだけ見つけて何がなんだか分からない助けてくれと言う前に簡単な基礎からやれという指摘はおかしいか? >>453
ちがうちがう
イテレータっていうのは繰り返しの抽象化だから、ランダムアクセスだのなんだのってのはおまけ
ポインタっていうのはアドレスに少し機能を付け加えたもの
リストのイテレータはリストのポインタと関係ないが、リストの特別版である配列のイテレータは配列のポインタと互換がある
だから、イテレータの操作とポインタの操作に互換があるというのは間違えてる
人に教える前にデータ構造について一から勉強しなおしたほうがいいのでは? ポインタに限ったことではなく、イテレータでもハンドルでも
「何が」「どこにある」という情報を持つもの、という概念を説明するとき
ポインタが最も直接的な実装となっているので
具体的なアドレス値を図に書いて説明できるし
復習するにも実測値でその図を書いてみることができるし
デバッガでも関係性を追ってみることが出来る
++で何をどう増やしているのか、比較とはどういうことかも
実測値から直感しやすい
そして、それで憶えたことがvectorのイテレータでならとりあえず通用する
そこからlistだとかistream_iteratorだとかへと差分学習で進めば楽だし
algorithmもポインタさえ知ってればとりあえず使えて
そこからまた差分学習でイテレータで使う場合を憶えれば楽という経験則
何か間違っているかね? 誰かさんみたいに、ちがうちがうと自分の繊細さに酔うやつが
学習者の思考を丹念に潰しやる気を削いでいく有害な騒音源となる
語学の先生にもいるだろ? イテレータはポインタに似せたというよりは、部分的にポインタと共通のインターフェイスに抽象化されたものであって、
C にも有ったポインタという機能と新しい機能を無理なく (?) 統合するアイデアでしょ。
だから、どちらが先にありきと言えるものではないけども、
大抵の C++ 入門書だと時代的に早く出現したポインタを先に説明するのが一般的だと思うし、
初心者がその流れに沿わない学習をしているのだとしたら
体系的に学ぼうとせず場当たり的に調べてるんじゃないのと疑うって話じゃないかな。
前提がちゃんと出来上がってない人の質問にきちんと答えるのは無理だよ。
だからこれとこれを先にやった方がいいよっていうのは誠実な回答だよ。 >>459
マジでアスペか
実用上どのように使うかって話をしてるのに、聞いてもいないのに一人で勝手に賢いイテレータの定義の話をしている
お前は>>412と>>419と>>422を100回読んでから入門サイトでどんな説明をしてるか見てこい
俺はその上で質問者のやろうとしていることは、ポインタを操作することと同じなのでまずポインタを理解してくれと言っている >>462
は? イテレータは少なくとも1993年以後にできたもので
ポインタはBにもあったもので、どちらが先にありきは明白だ
イテレータの設計にあたりポインタを意識しなかったなんて珍説を唱えるには膨大な説明がいると思うが
おまえやってみるか? 33e4-p7enの主張が二転三転していて何が言いたいのかわからん std::optionalもアクセス構文が同じだから、使うにはポインタの知識が必要なのかな >>463
必要なのは配列とインデックスと有効範囲だけだろ。ポインタを説明する必要は無い。 >>467
使うために必要かどうかではない
ポインタはC++を使う上で知ってて当たり前
ID:95r+Hm0D0 みたいに添字しかわかんねえと言われたらお前はそれよりもポインタからだとなる もうやめてくんない?
誰もイテレータの成り立ちなんて興味ないのよ 初心者に配列管理を説明するのにわざわざポインタ持ち出すな、つうてんの。そういう事言ってるから老害なんだよ。
range-based forを説明した方がよっぽど有益だわ。 >>460
もちろんvectorを例にイテレータとポインタをまとめて教えるのは一つの手段として有りだと思うよ
ただ、何度も書いてる通りポインタとイテレータは独立した概念だから、その差分学習は論理必然じゃない
現に、俺は学部時代に授業でプログラム習ったときは、vectorのような連続領域じゃなくlistのような抽象リストで習ってるし
ポインタはCの授業で、アドレスの抽象として習ってるし、イテレータはデザパタの本で知ったからね
どの学び方がいいかは人それぞれなんだろうけど、独立した概念を一緒だよとか変な方便使うのは間違ってると思うよ >>471
この意見はさすがに論外だわ
ポインタは難しいものでもややこしいものでもないから、ちゃんとした読み物があれば問題なく理解できる
難しいなら後回しにしてもいいならわかるが、最初から教えないというのは学習の機会を奪っているとさえいえる >>443
はげどう
>>444
言語選ぼうよ;;
>>445
イテレータはポインタの概念を引きずってゐる
プログラムの動作を簡明に表すという意味では
配列の構文さえあれば十分なのに、
※ 個人の感想です 老害が多いな
ソフトをやるならアセンブラからとか言いそうな勢い 尤も、C++の配列とか要素型であるクラスの継承とか多態性を表現しきらん欠陥品ではあるのだが
(インターフェースの配列はポインタの配列としてやるしかない;;
それゆえにやっぱC++で入門するなら中身知っとけと、 >>475
あなたに教えを請う人がいれば、あなたが教えたいように教えたらいい >>478
STLはテンプレートライブラリだから、動的なポリモーフィズムにガッツリ対応してないのは当然だし、
そーいうのがほしけりゃ自分で書けばいいだけ >>480
左様動的なポリモーフィズムにガッツリ対応したコンテナクラスのテンプレートを
曲がりなりにもかけるようになってからがC++の入門編
抽象化された上位レイヤーの知識だけあれば詳細は知らなくて良い、というのは
漏れのない抽象化が達成された後のみ通用する話だが
ずんねんながらC++はそうではないし言語の性格上っ今後とも永遠にそうはならない >>471
その有益というrange-based forを説明してくれよ。 >>483
悪いが馬鹿老害は黙っててくれないか。
若い人がせっかく説明したほうが有益だと言ってくれてるのだから。他の人も賛同してくれてる。 >>464
いや、もちろん意識してるだろ。
そう書いたつもりだけど、どこをどう読んだんだ? >>471
おまえさ、じゃあ配列の添字は何だと思っているわけ?
「どこにある」という情報をもつもの、という点で同じだぞ
だから for(i = first ; i != last; ++i) において first や last や i が
整数であろうがポインタであろうがイテレータであろうが
同じ論理が通用するんだろうがよ
ポインタで範囲外アクセスこくような大馬鹿者が
整数ならそんなことないとでもぬかすのか? >>472
おまえC++やCよりも前に何かやってただろ
俺だってC++をCより先に憶えたクチで
そんな真似ができたのはアセンブラ使いだったからな
間接の概念をまっさらから憶えるのに
イテレータは無駄に難しいマゾプレーだつってんだ
ポインタわかっててもハンドルで悩むやついるくらいで
それに輪を掛けて++まであるのがイテレータであって >>471
まだ説明してないのか。説明頼むよ。キミが言い出したことなんだよ。 (void*以外の)ポインタ自体も生のアドレス概念からは抽象化されている。
指されるオブジェクトの型やサイズを持っているんだからね。
それをさらに(ある方向に)抽象化したものがイテレータなんであって、そのように段階を追って
抽象化されていくストーリーを語るのは初心者向けにも有意義だと考える。 イテレータに限らないけど抽象化されたものは抽象化されたままで扱わないと抽象化した意味がなくて、
(内部の実装を意識しなきゃならないのなら抽象化の甲斐が無い。)
一方では、その抽象化を作る側になることもあるので抽象化が出来上がるまでは抽象化の内側も知ってなきゃいけない。
つまり、層を積み重ねるたびに抽象化の壁を作っていくってのがプログラムを構成する基本的なやり方だろう。
だから、プリミティブな方から積み重ねながらその抽象化が意味するところを学ぶってのは普通の方法だと思う。
そういう意味で >>493 に賛成。
抽象化の内側を知ってしまった人が抽象化の壁の向こうを忘れて抽象化されたものとしてだけ
扱うってのはそれなりにセンスがいるんじゃないかとも思うんだけど、
C/C++ の背景にあるセマンティクスは良くも悪くも機械の理屈なんで、
どうあがいても高級アセンブラだと割り切って泥臭いポインタの側から学ぶのがいいと私は思うよ。
その泥臭いところを頑張って隠してるのが C++ ってもんなんで、
泥臭いところを知ったら C++ の色んな機能が「あー、こういうの欲しかったわー」ってなってありがたみを感じる。 ストラウストラップが言うにはC++は
低レイヤーにアクセスできる機能とオーバーヘッドが無く使いやすいように隠蔽できる機能を持っている言語というようなことを言っていて
低レイヤーの部分を知らなくていいとは言っていない アセンブラの代替言語なのだから当たり前だ。用途もOSやドライバ、マイコン向けばかりだ。
COBOL、FortranやPerl、C#やJavaの代わりに使う人などいない。
低層を隠蔽する機能などお呼びではない。 いやCOBOLの代わりには使うぞ
Fortranの代わりつーとCな客はいたねえ http://opencv.jp/cookbook/opencv_img.html#image-resize
ここのソースコードをコピペしてコンパイルしようとしたのですが
関数 `cv::Mat::release()' 内:
test.cpp:(.text._ZN2cv3Mat7releaseEv[_ZN2cv3Mat7releaseEv]+0x47): `cv::Mat::deallocate()' に対する定義されていない参照です
collect2: error: ld returned 1 exit status
このようなエラー文が出てしまいます
使っているOSはdebian stretchです
/usr/include/opencv2には必要なファイルはありました
どのようにコンパイルすればいいのでしょうか >>501
すみませんでした
こっちで質問してみます c++に限った話じゃないんだけど参考書
とかだとメソッドの後にフィールドが
書かれてる事が多いようだけど、それが
一般的なの? ちがう
一般的にはフィールドたるメンバ変数の方が先に来る
学習の都合で、メンバ変数を先に説明した方が、どう考えてもラク
メンバ関数を先に説明すると、入門書を読むレベルの初心者は間違いなく混乱するので、そんな参考書はまず見かけない
そもそもメソッドの中で使う変数は始めに宣言しておかないと使えない
結論としてはあなたが用語の取り違えをしてる……としか レイアウト、というとデータの並び順の意味にとられかねず語弊がある public、protected、privateの順に書いていくと
自然と変数はpublic関数の次に来るわ 普通アクセス修飾子の順じゃなくてフィールド→メソッドの順じゃないの
カプセル化するから変数なんてほとんどprivateだろうし
変数は変数でまとめて書いてもらわないと混乱する ユーザーにとって重要な項目から順に書く
つまり、public→protected→privateで
ユーザーに見せる必要のないprivateは一番下で 変数の宣言と関数の宣言の順序がどうでも良いのは自明
メンバ関数の定義がメンバ関数内で使用するメンバ変数の宣言に先行する場合も実験する限り合法
(規格に具体的にどういう文言で規定してあるのかは知らん
まあ定義時点で不完全な型やら値やらはテンプレートの定義で頻出するから
あんま定義と宣言の順序にこだわらない処理系の作りなのだと納得しておく
しかしなぜかテンプレートの引数でない型の定義(または宣言)と使用には厳格な順序を求められる…
次のコードはビルドが通らない
class Baz {
// struct Bar; // 左のコメントアウトを外したら逝ける
void foo(Bar& b);
struct Bar { int x, y; }
};
多分Cとの互換性のために仕様がワケワカメになった例 ルールが存在してwell documentedで、ガバナンスがきいていることが重要
お前らのオレオレ哲学なんかどうでもいい ああそっか、プロトタイプ宣言しなきゃいけないんだっけC++は
C#の脳で考えてたわ >変数の宣言と関数の宣言の順序がどうでも良いのは自明
自明かねぇ
C++11は問題になる例が思いつかないがC++98,03,14はどうでも良くない コンストラクタ実行時のメンバ変数の初期化の実行順が、初期化子の記述順ではなくクラス定義での並び順に従うっていうのがあった気がするけど、新しい規格では変わったんだっけ? ■ このスレッドは過去ログ倉庫に格納されています