3

私は通常、次のようなブール値の「firstTime」を使用します。

C ++の場合:

bool firsTime = true;
for (int i = 0; i < v.size(); i++) {
    if (firstTime) {
        //do something just once
        firstTime = false;
    }
    else {
        //do the usual thing
    }
}

Javaでは、boolの代わりにbooleanを使用しても同じであるため、コードは配置しません。

質問は、とにかくjavaまたはc / c ++で、if句でbool / booleanを使用し、そのbool / booleanに値falseを自動的に割り当てることはありますか?

私はそれがナンセンスに見えることを知っていますが、それは私のコードをたくさん節約するでしょう。なぜなら私は多くの基本的なケースを持っており、それは重要です。

if句で使用した後にfalseに値を設定する方法があるかどうかを知りたいです。私は、forまたはwhileで、次のことを使用できることを知っています。

if (i == 0)

しかし、私はまた、物事を知る必要があり、通常はboolによって参照される関数の呼び出しについても考えていました。

4

11 に答える 11

7

条件を次のように変更します

if ( i == 0 )
{ 
}
//...

余分な変数を完全に取り除きます。

編集これを1行で行う方法に関するすべての提案を見た後、私は1つの結論にしか到達できません-しないでください。あなたが持っているものを使うだけで、それははるか明確になります。

于 2012-06-20T13:14:35.917 に答える
4

まだカウントがない場合は、ブール値の代わりにカウントを使用できます

long counter = 0;
for(String arg: args) {
    if(counter++ == 0) {
       // first
    }
}

ブール値を使用する代替手段は

boolean first = true;
for(String arg: args) {
    if(first && !(first = false)) {
       // first
    }
}

セットの場合も同様のパターンがあります

Set<String> seen = ...
for(String arg: args) {
    if(seen.add(arg)) {
       // first time for this value of arg as its only added once.
    }
}
于 2012-06-20T13:25:02.950 に答える
4

変換演算子を使用して使い捨てガードを構築するC++固有のソリューションがあります。

class first_guard {
    bool val;
public:
    first_guard() : val(true) {}
    operator bool() { bool res = val; val = false; return res; }
};

ガードの使用方法は次のとおりです。

first_guard first;
for (int i = 0 ; i != 5 ; i++) {
    if(!first) {
        cout << i << ' ';
    }
}

このコードは1 2 3 4、をスキップして出力し0ます。

変換演算子がないため、Javaでこのソ​​リューションを複製できません。

于 2012-06-20T13:32:12.257 に答える
2
for (int i = 0, firstTime = 1; i < v.size(); i++, firstTime = 0) {
于 2012-06-20T13:19:25.050 に答える
1

編集:あなたが持っているものの使用についてのLuchianの編集を参照してください。同意します。それは非常に明確です。

最初のループの反復をループから外してみませんか?

//do something just once (if needed, so check)
for (int i = 1; i < v.size(); i++) {
    //do the usual thing
}

ここで、この最初のことを行わない可能性がある場合は、それを確認する必要がありますが、多くの場合、少なくとも1回の反復を行うでしょう。

于 2012-06-20T13:16:03.783 に答える
1

最初の反復で、(「通常のもの」ではなく)通常の「もの」に加えて追加の初期化が必要な場合は、次のように検討します。

for (int i=0, do_first_time_stuff(); i<v.size(); i++) {
    do_other_stuff();
}

別の可能性は次のようになります。

Initialization();
std::for_each(v.begin()+1, v.end(), loop_body);
于 2012-06-20T13:35:11.260 に答える
0

forループの外で最初にやろうとしていることは何でもしてから、イテレータを1つ起動します。

if (v.size() > 0) {
    /* first time code */
}
for (int i = 1; i < v.size(); i++) {
    /* second time or more */
}

foreachループを使用している場合、ソリューションはかなり堅実です。

于 2012-06-20T13:16:14.847 に答える
0

次のようなことをしてみませんか。

void firstTime() {
    // do stuff
}

void doWork(int i) {
    // do stuff
}

firstTime();
for(int i = 1; i<v.size();i++) {
 doWork(i);
}
于 2012-06-20T13:16:57.823 に答える
0

初めてのアクティビティでリストの内容を使用していない場合。

if(v.size() >=1 ){
  //do Something for 1 time
}
for (int i = 0; i < v.size(); i++) {
        //do the usual thing
}

リストの内容が必要な場合は、

if ( i == 0 )
{ 
}

LuchianGrigoreによって提案されたように

于 2012-06-20T13:20:20.837 に答える
0

あなたは試すことができます(C ++):

bool checkFirst(bool& first)
{
  bool result = first;
  first = false;
  return result;
}

bool firstTime=true;
// loop here { 
if (checkFirst(firstTime))
{
  // do firsttime stuff
} else {
 // do regular stuff
}
// } // end loop

Java:

public class CheckFirst
{
  private boolean first;

  public CheckFirst()
  {
    first = true;
  }

  boolean check()
  {
    boolean result = first;
    first = false;
    return result;
  }
}

CheckFirst first = new CheckFirst();
// loop here {
if (first.check()) {
  // do first stuff
} else {
  // do regular stuff
}
// } // end loop
于 2012-06-20T13:21:06.820 に答える
0

私はこのようなことを試してみます、それはうまくいきますが、それが完全に正しい方法であるかどうかはわかりません。(http://ideone.com/Bcjva

boolean boo = true;
if( !((boo) ? (boo = !boo) : boo)) //enters the if successfully, but inside,prints boo as false.
     System.out.println(boo);
于 2012-06-20T13:21:47.993 に答える