私はPascalでプログラミングしていて、セットに含まれる要素の数を知ることができる、標準ライブラリなどにすでに作成されている関数/プロシージャがあるかどうかを調べようとしています。
forループと、要素が見つかったときに+1を増やすカウンターを使用してそれを行う方法を知っています(セットを印刷するときに実行する必要があるのと同様です)が、他にもっと簡単な方法があるかどうか疑問に思いました私が言ったように、それを行うことのいくつかの事前定義された標準的な機能/手順?
私はPascalでプログラミングしていて、セットに含まれる要素の数を知ることができる、標準ライブラリなどにすでに作成されている関数/プロシージャがあるかどうかを調べようとしています。
forループと、要素が見つかったときに+1を増やすカウンターを使用してそれを行う方法を知っています(セットを印刷するときに実行する必要があるのと同様です)が、他にもっと簡単な方法があるかどうか疑問に思いました私が言ったように、それを行うことのいくつかの事前定義された標準的な機能/手順?
セットが1、2、4、または8バイトの場合、最近導入されたpopcnt組み込み関数を使用できます。
この組み込みはシステムにありますが、トランク(2.7.1)にのみあります
function PopCnt(Const AValue: Byte): Byte;[internproc:fpc_in_popcnt_x];
function PopCnt(Const AValue: Word): Word;[internproc:fpc_in_popcnt_x];
function PopCnt(Const AValue : DWord): DWord;[internproc:fpc_in_popcnt_x];
function PopCnt(Const AValue : QWord): QWord;[internproc:fpc_in_popcnt_x];
その理由は、古典的なセットではなく、暗号化/圧縮アルゴリズムを高速化するためにおそらくもっと探求されなければなりません。
標準パスカルにはありません。多くの実装には非標準の追加があります。たとえば、GNU Pascalには機能Card
(「カーディナリティ」の略)があります:http ://www.gnu-pascal.de/gpc/Card.html#Card 。
編集私はこれがFreePascalとタグ付けされているのを見ます、そしてこのページによると、それはそのような追加を欠いています。カウンターをインクリメントするセットをループする必要があります。少なくとも、すべての可能性をループしてそれぞれが存在するかどうかを確認するのではなく、実際にセット内の要素をループするだけで済みます...