C++相談室 part163

レス数が900を超えています。1000を超えると表示できなくなるよ。
2022/12/30(金) 23:16:31.37ID:DPUEZfMS0
!extend:checked:vvvvv:1000:512
!extend:checked:vvvvv:1000:512
↑同じ内容を3行貼り付けること

次スレは>>980が立てること
無理なら細かく安価指定

※前スレ
C++相談室 part162
https://mevius.5ch.net/test/read.cgi/tech/1667194175/
VIPQ2_EXTDAT: checked:vvvvv:1000:512:: EXT was configured
2023/04/09(日) 09:19:40.13ID:Dm0aM9sgF
#define True !False
printf("%d", True);

# 1
819デフォルトの名無しさん (アウウィフ FF05-883t)
垢版 |
2023/04/09(日) 09:20:16.12ID:Dm0aM9sgF
>>817
ほんそれ++
820デフォルトの名無しさん (アウアウウー Sa05-/Yip)
垢版 |
2023/04/09(日) 23:45:39.86ID:Gr5O5zRWa
c++の入門書のサンプルでは、整数を 42で初期化するケースが多い気がします
この 42(fooやbarを使うように)には意味があるのでしょうか
2023/04/09(日) 23:49:54.13ID:mWJqmDjC0
>>820
https://ja.wikipedia.org/wiki/%E7%94%9F%E5%91%BD%E3%80%81%E5%AE%87%E5%AE%99%E3%80%81%E3%81%9D%E3%81%97%E3%81%A6%E4%B8%87%E7%89%A9%E3%81%AB%E3%81%A4%E3%81%84%E3%81%A6%E3%81%AE%E7%A9%B6%E6%A5%B5%E3%81%AE%E7%96%91%E5%95%8F%E3%81%AE%E7%AD%94%E3%81%88
822デフォルトの名無しさん (アウアウウー Sa05-/Yip)
垢版 |
2023/04/10(月) 00:03:58.95ID:PpQYou85a
>>821
thx!
2023/04/10(月) 10:38:06.12ID:auMz+cIB0
constevalな関数の中でchar配列中からintを読み取る場合ってポインタ使えないから下記のようにするしかない?
arr[index] | ((int)arr[index + 1] << 8) | ((int)arr[index + 2] << 16) | ((int)arr[index + 3] << 24);
2023/04/10(月) 13:13:53.16ID:j1Pkk3Kb0
>>823
constevalじゃなくても環境依存せずにその手の数値取り出しをしたければそうする他無い。
あと(int)は意味ないと思う。
2023/04/10(月) 13:14:40.33ID:Y31i0sl00
>>823
共用体は使えないの?
826デフォルトの名無しさん (スップ Sd82-qF+M)
垢版 |
2023/04/10(月) 15:33:11.04ID:3mw67OVid
32bit-little endianであることを前提になるがいいか?
あとこれarr[3]が0-127に収まってないとintの符号ビット壊しそうだし、
charが符号付きの環境だとシフト+bit orが意図通りにならなそう
2023/04/11(火) 00:04:23.89ID:Ta/4j/O20
>>823
consteval使えるならbit_castも使えるのでは
2023/04/11(火) 00:07:23.43ID:HzbpoBAH0
>>827
配列の一部だけを参照する方法がないから
bit_cast を使うなら bit_cast を使える状態にする必要があって
この場合はあまり楽にならない。
2023/04/11(火) 12:34:29.16ID:Ii6omevMd
>>826
おもいっきり環境依存なコードに対して環境依存を心配するアホ
2023/04/11(火) 12:34:35.05ID:Ii6omevMd
>>826
おもいっきり環境依存なコードに対して環境依存を心配するアホ
2023/04/11(火) 15:29:28.26ID:No77oSsN0
右シフトはおもいっきり符号にひっぱられるけど左シフトならセーフだべ?
2023/04/11(火) 15:38:30.59ID:aQanOcc40
char→intで符号拡張されちゃうべ
2023/04/11(火) 15:39:28.74ID:No77oSsN0
んだんだ 0xff で マスクするべな
2023/04/11(火) 15:43:02.02ID:No77oSsN0
(0x0ff & (int)a[i]) |
(0x0ff & (a[i+1] <<8)) |
(0x0ff & (a[i+2] <<16)) |
(0x0ff & (a[i+3] <<24))
これでよろしかですかの?
2023/04/11(火) 15:43:45.69ID:No77oSsN0
ひでぇ間違えた もういいー
2023/04/11(火) 15:47:35.33ID:ukUq4n2Z0
>>834
そんなことしなくても (int)(unsigned char) でいいのでは?
2023/04/11(火) 16:07:55.56ID:No77oSsN0
んだな
2023/04/11(火) 17:30:55.22ID:K2f5iX7Sd
(int) いらね
2023/04/11(火) 18:27:39.70ID:3b0RAKoL0
(unsigned int)arr[index] | ((unsigned int)arr[index + 1] << 8) | ((unsigned int)arr[index + 2] << 16) | ((unsigned int)arr[index + 3] << 24);
2023/04/11(火) 18:33:47.48ID:3b0RAKoL0
いや、こうか
arr[index] | int((unsigned)arr[index + 1] << 8) | int((unsigned)arr[index + 2] << 16) | int((unsigned)arr[index + 3] << 24);
841デフォルトの名無しさん (アウアウエー Sa0a-0l8A)
垢版 |
2023/04/11(火) 18:49:44.57ID:HmfbYrEaa
以下はTCP/IPのクライアントを作成する例なのですが、このコードにタイムアウト値を付けるにはどうしたら良いですか?
http://onishi-lab.jp/programming/tcp_win.html

// Windows の場合
WSADATA data;
WSAStartup(MAKEWORD(2,0), &data);

// 相手先アドレスの入力と送る文字の入力
printf("サーバーマシンのIPは?:");
scanf("%s", destination);

// sockaddr_in 構造体のセット
memset(&dstAddr, 0, sizeof(dstAddr));
dstAddr.sin_port = htons(PORT);
dstAddr.sin_family = AF_INET;
dstAddr.sin_addr.s_addr = inet_addr(destination);

// ソケットの生成
dstSocket = socket(AF_INET, SOCK_STREAM, 0);

//接続
if(connect(dstSocket, (struct sockaddr *) &dstAddr, sizeof(dstAddr))){
printf("%s に接続できませんでした\n",destination);
return(-1);
}
2023/04/11(火) 19:25:01.15ID:BlUKqEB00
winsock2 connect タイムアウト
843デフォルトの名無しさん (アウアウエー Sa0a-0l8A)
垢版 |
2023/04/12(水) 20:53:53.05ID:slmCp11Ka
>>842
ありがとうございます。
この記事のWindows版を参考にしてタイムアウトつき接続できたのですが
https://qiita.com/hidetaka0/items/501ad17b4c23c3adee03

これってちゃんとサーバーに接続できた場合、接続できたことをコード内のどこで判別すれば良いのでしょうか?
色んな箇所にprintを仕込んでみたのですがよくわかりませんでした。
2023/04/12(水) 21:19:15.87ID:3roUAINp0
//読み書きできる状態
2023/04/12(水) 21:38:01.94ID:IOSSRt+R0
ネットワークプログラミングスレってあったと思うんだけど
何でここで質問するのか理解できない
846デフォルトの名無しさん (スプープ Sd22-pvw1)
垢版 |
2023/04/13(木) 00:15:12.61ID:ndOnjJhod
>>844
そこにprint挟んでも通過しないんですよね
繋がってるのに
2023/04/13(木) 01:15:15.35ID:DRH76Ra10
>>846
ほんとにつながってるの?
そこ通らないと他はエラー(-1)しか返さないんじゃないの?
2023/04/13(木) 01:23:34.33ID:DRH76Ra10
>>846
あと、printfはメインスレッドからコールしないと遮断されること普通にあるぞ
ファイルにfprintfで書いてみれよ
2023/04/13(木) 01:28:55.79ID:DRH76Ra10
あと考えられる問題は、スレッドのスタックが足りなくてprintfがコールできていない可能性だな
いろいろと洗ってみれ
850デフォルトの名無しさん (スプープ Sd22-0l8A)
垢版 |
2023/04/13(木) 02:30:15.77ID:/ixh6GMqd
>>847
以下のようにprintというかcoutを挟むと、接続前はずっと"1"が出力されるのに、接続後は何も出力されなくなります。
エラーも出ず、プログラムは動き続けます。

int sockNum = select(socket + 1, &readFd, &writeFd, &errFd, &timeout);
if(0 == sockNum)
{
//timeout
std::cout << "1" << std::endl;
return -1;
}
else if(FD_ISSET(socket, &readFd) || FD_ISSET(socket, &writeFd) )
{
std::cout << "2" << std::endl;
}
else
{
//error
std::cout << "3" << std::endl;
return -1;
}
std::cout << "4" << std::endl;
2023/04/13(木) 02:46:49.32ID:DRH76Ra10
そこ、コードが間違ってるな
selectのエラーは負の値返したときだよ
2023/04/13(木) 06:22:49.75ID:DRH76Ra10
だがしかし、エラーじゃなくてタイムアウト検査して0と比較しているからこのままでも問題はないか
timevalのタイムアウト値がまちがってんじゃねーの?とは思う
2023/04/13(木) 07:23:10.38ID:8nXR27xn0
socket + 1って何だっけ
おかしい原因これじゃないの?こういうもんだっけ?
854デフォルトの名無しさん (ワッチョイ a2fb-qF+M)
垢版 |
2023/04/13(木) 08:05:52.88ID:AKmB1uVA0
VisualStudio使ってるんならステップ実行したほうがはやいんじゃね

1行ずつ実行してどこでクラッシュ/待たされてるかすぐにわかるぞ
2023/04/13(木) 10:00:54.60ID:4kBfFXBL0
接続後にConnect呼んでないだけでしょ
856デフォルトの名無しさん (スプープ Sd22-pvw1)
垢版 |
2023/04/13(木) 10:36:58.20ID:GsnZRt31d
>>855
コード内のどこでconnectを呼べば良いですか?
2023/04/13(木) 15:55:39.85ID:4kBfFXBL0
>>856
ソースをうpは無理?
2023/04/13(木) 17:56:14.36ID:iNDrHE0O0
初心者なのですが、find()で結果がないときnposの場合と.hoge.end()の場合、
イテレータで hoge.begin()とする場合と begin(hoge)とする場合(end()も同様)、等
混乱しております。これは...
2023/04/13(木) 18:12:14.03ID:zEEI4t8g0
nposってstd::basic_stringのか?
#include <algorithm>のfindとは別物だぞ

メンバ関数でfindを持っているオブジェクトならhoge.begin()
持っていないオブジェクトにはbegin(hoge)
2023/04/13(木) 18:22:14.89ID:y5cvZaYN0
>>858
algorithm にある std::find と string にある std::string::find の違いのことかな?
それはまあ名前が同じだけの別物なんでそういうものと思うしか仕方がない。

begin については、
異なるものが共通のインターフェイスで扱えるとテンプレート内で扱いやすいだろうというのが基本的な事情。
でも配列とかポインタがメンバを持つことは出来ないからこれらも含めて共通の扱いをしたい場合は
メンバ関数の begin よりも非メンバ関数の std::begin を使う必要がある。
メンバに begin を持っている場合はそれを直接に呼んでも std::begin を使っても結果は同じだよ。

C++ には ADL という仕組みがあって引数に関連する名前空間も関数を探す探索対象になるというルールがある。
std::begin は ADL の仕組みと相性が悪いところがあって扱いづらいので
新しい仕様は std::ranges::begin が導入された。

ややこしいんだが全部を一貫して説明できるような統制された理屈があるわけではなくて
細々とした歴史的事情の積み重ねでグダグダになってるだけ。
2023/04/15(土) 01:20:02.46ID:dgB6RPkk0
intとsize_tって足し算したらsize_tになるんか・・・?
2023/04/15(土) 02:11:09.11ID:KQOFatDn0
bit数の大きい側に拡張してから演算するんやっけ
2023/04/15(土) 02:27:21.46ID:m2iUDqjP0
不安ならキャストせい
2023/04/15(土) 02:33:26.00ID:dgB6RPkk0
改めて書くと
std::vector<...> vec;
int neg = -15;
for(int x = neg ; x < neg + vec.size() ; x++){ ...
こんな感じのfor文の中になぜか入ってこず
for(int x = neg ; x < neg + (int)vec.size() ; x++){ ...
こう書き換えたらfor文の中にちゃんと入ってきたので
何事かと
2023/04/15(土) 02:57:32.14ID:m2iUDqjP0
そりゃビット数の多いsize_tに自動的にキャストされるからな
2023/04/15(土) 09:19:08.06ID:9E7JiVxa0
コンパイラの警告出てるでしょそれ
867デフォルトの名無しさん (ワッチョイ 5ffb-ZLJR)
垢版 |
2023/04/15(土) 12:55:47.51ID:ZHLNp/Uz0
32bit intが表現できる範囲(-21億〜+21億)と
size_tが表現できる範囲(32bit環境なら0〜42億、64bit環境なら1800京)が違うんだよね

直接キャストしたり比較演算した結果が一目で分からないし、
未規定の動作も紛れてるから
コンパイラによって結果が変わったりする
2023/04/15(土) 15:43:33.34ID:5Qe8Q1VE0
ちなみに更に厳密なことを言うと std::vector::size() の返却値の型は std::vector::size_type であって、
一般的な実装では size_t の別名として定義されることが多いけどそうでないこともありうる。
2023/04/15(土) 17:41:19.21ID:SXeCdLds0
移植性を気にする人ってtypename std::vector<hoge>::size_typeとか書いてるの?
2023/04/15(土) 18:32:47.38ID:9E7JiVxa0
こんなかなあ
不用意にsize_t決め打ちはなるべくしない(せざるをえない場合もある)

auto N = v.size();

for(decltype(N) i = 0; i < N; ++i) { /**/ }
2023/04/15(土) 20:20:15.05ID:iq3ZlEDB0
単にsize_tの型とイコールじゃなかったらエラーではねとけばいいんじゃね
想定外環境でも何でもかんでも通そううなんて思考はバグの元になるし
2023/04/15(土) 20:53:24.33ID:9nQxeRw/0
NAXDE
2023/04/15(土) 20:58:21.87ID:9nQxeRw/0
なんでsize_tをunsigned にしたんだろうな…
2023/04/15(土) 21:05:21.11ID:r+oi7xUE0
そりゃサイズに負数はあり得ないからでは?
-12バイトのファイルなんてありえないですし
2023/04/15(土) 21:41:39.88ID:fX0vt5Cu0
奥さん! そこでssize_tですよ!
2023/04/15(土) 22:41:45.51ID:21huWqOn0
数の概念が生まれた当初は負の数なんて想像つかなかったしな。
マイナス3個のリンゴとか存在しないし。
2023/04/15(土) 22:44:53.66ID:r+oi7xUE0
つまりマイナスの概念が存在しない時からsize_tは存在していた!?
2023/04/15(土) 23:18:30.96ID:mFN3uRP10
負数があるならssize_tやptrdiff_tと使い分けなよ…
2023/04/16(日) 09:49:57.27ID:KtrVYfy50
for (size_t k = 999; k >= 0; k--) {
 ...
2023/04/16(日) 12:17:04.86ID:mZTbxJpt0
for (size_t k = 999; k+1 > 0; k--) {
 ...
2023/04/16(日) 17:59:44.79ID:gghWvzSgd
k > -1
2023/04/16(日) 21:30:04.86ID:SbMfPVDO0
k < -1
2023/04/16(日) 23:08:58.58ID:EOwLLPBr0
くノ一
884デフォルトの名無しさん (アウアウウー Sacb-/q5i)
垢版 |
2023/04/17(月) 20:58:44.15ID:RKcegE7fa
size_t の変数を 0 との大小で比較しても
常に >= 0 だから変なことになる
for で -- してるときは特に注意な
2023/04/18(火) 07:58:45.20ID:EVDEK+w/M
負の数、虚の数
2023/04/18(火) 09:29:12.70ID:hwR9qYx/0
符号無しループはグーグルだとコーディング規約違反だからな
887デフォルトの名無しさん (ワッチョイ 2763-7nfa)
垢版 |
2023/04/19(水) 11:20:40.34ID:twYHK80b0
コーディング基準はあくまで特定案件での決めごとに過ぎず
井の外で何かを批判する根拠に使っても説得力はない
2023/04/19(水) 11:50:42.02ID:rE0e6VM+0
符号ありしかない言語もあるから、それなりに一般性あるかと
889デフォルトの名無しさん (ワッチョイ 2763-7nfa)
垢版 |
2023/04/19(水) 12:06:58.70ID:twYHK80b0
特定案件つーてるのに他の言語?
話通じないやつだな
2023/04/19(水) 12:12:27.61ID:rE0e6VM+0
あれ?話広げたいんじゃなかったのか こりゃ失礼
2023/04/21(金) 06:54:24.86ID:zpP4hMgV0
std::vector<T>::size()やstrlen()が符号無しで返してくるからそれらを使った汎用ライブラリ的なものを書く場合に仕方なくsize_tを使うこともあるだけでループ変数については符号有りで大して困らない希ガスだいたいOS記述言語であるところのC言語がアセンブラでは常識的に利用されるゼロフラグやキャリーフラグの概念を捨て去った設計した点をかみしめるべきや整数表現のMSBまで符号以外の意味で使わねばならないシチュエーションはマジ少ない多倍長演算であってさえ2のべき乗範囲に拘るのを捨てたらゼロフラグやキャリーフラグを駆使してビット幅全部使う記述と同等以上の効率にできうる
2023/04/21(金) 07:19:21.58ID:opTauXds0
句読点を入れろ
2023/04/21(金) 08:49:31.32ID:6fw7yQrg0
江戸時代かよ。
2023/04/21(金) 11:52:07.81ID:Er6tcVYC0
スレチだと思うけどx86intrinsicsに詳しい人がいたらNonTemporal命令について教えてもらいたい
_mm_stream_load_si128や_mm_stream_si32はCPUキャッシュに対象範囲が無い場合はキャッシュスルーして確実にメモリを読み書きするということは分かったけど、
CPUキャッシュにある場合の挙動は一般的な命令同様にCPU内だけで完結してしまう?
2023/04/26(水) 10:00:37.79ID:N7+hGpB4a
>>891
読める・・・
読めるぞ!!
2023/04/26(水) 12:19:22.01ID:eD6bPnvLd
>>894
パフォーマンスを気にしてるなら実験、測定するべきだし
同期ならメモリバリア命令など適切な措置を取るべき
2023/04/26(水) 19:26:58.67ID:4J8YauGVM
素人考えで悪いけどメモリへの書き込みがされずCPU内だけで終わると困ると思うけど

勝手なイメージ

書き込むアドレス内容がキャッシュに
ある
キャッシュのデータも書き換える → 通常の動作

ない
_mm_stream_si32の場合 キャッシュへデータを読み込まない → 速い
その他の場合 キャッシュへデータを読み込む → 遅い
2023/04/26(水) 20:14:03.72ID:4J8YauGVM
avx2でnon temporay loadの方を比較したけどほぼ変わらない
サイズが小さすぎたせいかもしれないけど
2023/04/26(水) 22:05:00.98ID:T6VCSheE0
>>896
目的はDMAとの整合性で既存の実装は勿論同期処理していたが
数日稼働させてみてTemporal命令混ぜた後にstreamストアしても今のところ不整合発生してないからもうちょい様子見てみる
2023/04/26(水) 22:12:18.77ID:T6VCSheE0
>>898
本来のnon temporal命令の利点はその命令自体の速度ではなくキャッシュ汚染防止だね
例えば離れたアドレスにあるであろうstatic変数にアクセスするとき、その付近のデータには一定期間内に一度しかアクセスしないと分かりきっているなら、CPUの親切心による近隣メモリのキャッシュへの先読みはどうせ使われないのでむしろペナルティでしかなく不要となる

あとはmemcpyにおいてキャッシュはソース側に集中させてディスト側へは_mm_streamでキャッシュ汚染を抑えてコピーをするというテクニックもあって多分メジャーどころのコンパイラ実装は大体そうなってる
IvyBridge以降であればsimdより強化版rep movsbの方が早いケースも多くて分岐によってそっちに行くこともあるだろうけど
2023/04/26(水) 22:46:41.52ID:4J8YauGVM
>>900
それなら納得

AMDでも試したけど変わらないな
2023/04/26(水) 22:54:06.40ID:4J8YauGVM
それとx86intrinsicsと書かれてるのはSystem.Runtime.Intrinsics.X86 名前空間で.netなんだ
コンパイラがキャッシュを気にしたIL吐いたりそこから最適化されたネイティブコードを吐くようにはできてないと思う
2023/04/30(日) 10:58:06.37ID:W+TV1tj50
これまでなんとなくinitializer_listを使ってきたのですが
このクラスって他のクラスと異なりコンパイラによって特別な解釈をされるのでしょうか?
以下のhoge::initializer_listはstdからコピペしてpublicメンバ以外を除外したものです
hoge::initializer_listを実体化するとコンパイルエラーとなります
コンパイラは g++ (Debian 10.2.1-6) 10.2.1 20210110 です
#include <initializer_list>
#include <cstddef>
namespace hoge {
template<class _E>
class initializer_list {
private: // 割愛
public:
typedef _E value_type;
typedef const _E& reference;
typedef const _E& const_reference;
typedef size_t size_type;
typedef const _E* iterator;
typedef const _E* const_iterator;
constexpr initializer_list() noexcept;
constexpr size_type size() const noexcept;
constexpr const_iterator begin() const noexcept;
constexpr const_iterator end() const noexcept;
};
}
int main () {
std::initializer_list <int> il0 = {10, 100, 1000};
hoge::initializer_list <int> il1 = {10, 100, 1000}; // <- コンパイルエラー
return 0;
}
エラーメッセージは
error: could not convert ‘{10, 100, 1000}’from ‘<brace-enclosed initializer list>’ to ‘hoge::initializer_list<int>’
2023/04/30(日) 11:09:10.55ID:W+TV1tj50
エラーメッセージから考えると
1. { ..., ..., ..., }はstd::initializer_listと解釈される
2. std::initializer_listをhoge::initializer_listに変換しようとしてエラー
ということだと予想しますが
上記の1がstd::initializer_listを特殊なクラスとしている言語仕様と考えれば良い?
2023/04/30(日) 11:20:07.93ID:bMmQu4ho0
>>903
constexpr initializer_list(std::initializer_list<_E> const&) noexcept { }
これを追加すると通る

コンパイラは { } で std::initializer_list を生じる、という意味で「特別な解釈」をする
似たような話で typeid() で std::type_info を生じるのと同様
2023/04/30(日) 11:20:11.94ID:orzgKU680
継承も何もしてないのにhoge::で上手く行くワケないだろ
2023/04/30(日) 11:25:59.75ID:orzgKU680
せめて>>985みたいにstd::initializer_listを何かしらの形で受け入れ口としてコンストラクタに実装してやらないと通らないだろ
2023/04/30(日) 11:31:13.64ID:9Izkr3hY0
一般にstd名前空間のものは全部言語仕様と一体のものとしてあらゆる特別扱いが許されてるので
ヘッダからコピペして作った自作クラスが標準と同じように振る舞ってくれない可能性は常にある
2023/04/30(日) 11:36:13.87ID:W+TV1tj50
>>905-908
みなさん有難うございます

>>908
>一般にstd名前空間のものは全部言語仕様と一体のものとしてあらゆる特別扱いが許されてるので
これは最小限にして欲しいものですね

>>905
>似たような話で typeid() で std::type_info を生じるのと同様
なるほどー! 言われてみればこれも気持ち悪かったです
同種の気持ち悪さ
2023/04/30(日) 11:38:03.98ID:cNEEfLAb0
初期化リストは式ではない
2023/04/30(日) 18:30:04.58ID:KfqDu01oH
低レベルな質問ですが、よろしくお願いします

char str[10] = {0};

char str[10] = {0,};

この二つって違うんですか?
2023/04/30(日) 18:59:49.81ID:F7/GeCtB0
>>911
下は0,0と同じ意味じゃないかな
2023/04/30(日) 19:05:00.57ID:3Dh4f3TB0
どっちも10個とも0になる
2023/04/30(日) 19:21:03.63ID:orzgKU680
最後のカンマの次に項目を書かなくてもエラーにならなくなった名残だな
2023/04/30(日) 19:25:11.20ID:AIS6Ui5R0
>>911
最後のカンマに文法上の機能はなく、単に余計なカンマを許容するだけ。
どちらも 0 がひとつ与えられる初期化子であるという扱いになる。
コードジェネレータで生成するときに余計なカンマを許容したほうが便利だからそうなってる。

初期化子の数が配列の大きさに足りない場合は >>913 の解説の通り 0 が補われるので10個の要素全部がゼロになる。
なので全部をゼロにしたいときは char str[10] = {}; というように書いてもよい。
(新しい規格では改定されているが) C では波括弧の中に 1 個以上の値を必要としたので
それに合わせて必ずひとつは 0 を書くというスタイルで書く人もいる。
2023/04/30(日) 19:26:34.51ID:KfqDu01oH
丁寧な解説ありがとうございました。
どちらとも10個ともに0になるんですね
2023/05/01(月) 10:47:39.75ID:X35rXuLL0
STLにある、k番目の要素を見つけるnth_element()は計算量がO(n)だそうですが、
これの中身が何をやっているかの日本語の(できるだけむずかしくない)解説ってどこかに
ありますかね?
レス数が900を超えています。1000を超えると表示できなくなるよ。
5ちゃんねるの広告が気に入らない場合は、こちらをクリックしてください。

ニューススポーツなんでも実況