簡體   English   中英

使用第一次布爾c ++或java

[英]using a first time boolean c++ or java

我通常使用像這樣的布爾'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是相同的,所以我不放置代碼。

questin是,無論如何在java或c / c ++中使用if子句中的bool / boolean並自動賦值給bool / boolean值false?

我知道這似乎是一個廢話,但它會保存我的代碼很多行,因為我有很多基本情況,而且很重要或者很重要。

我確實想知道在if子句中使用它后是否仍然將值設置為false。 我知道在一個或多個時間我們可以使用:

if (i == 0)

但我也在考慮調用需要知道事物的函數,並且通常由bool引用。

我只是將條件改為

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

並完全擺脫額外的變量。

編輯在看到關於如何在一行中執行此操作的所有建議后,我只能得出一個結論 - 不要 只要使用你擁有的東西,它就會更加清晰。

如果您還沒有計數,則可以使用一個而不是布爾值

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.
    }
}

有一個特定於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中復制此解決方案。

for (int i = 0, firstTime = 1; i < v.size(); i++, firstTime = 0) {

編輯:請參閱Luchian關於使用您所擁有的內容的編輯。 我同意。 很清楚。

為什么不把第一個循環迭代拉出循環?

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

現在,如果有可能你不能做第一件事你需要檢查,但很多時候你可能至少會做一次迭代。

如果第一次迭代除了通常的“東西”(而不是“而不是通常的東西”)之外應該只有一些額外的初始化,我會考慮這樣的事情:

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);

我會做第一次在for循環之外做的任何事情,然后啟動迭代器。

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

如果您使用的是foreach循環,那么您的解決方案非常可靠。

為什么不做這樣的事情:

void firstTime() {
    // do stuff
}

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

firstTime();
for(int i = 1; i<v.size();i++) {
 doWork(i);
}

如果您沒有在第一次活動中使用列表的內容。

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

如果您需要列表的內容,請使用

if ( i == 0 )
{ 
}

正如Luchian Grigore所說

你可以嘗試(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

我會嘗試這樣的東西,它有效,但我不確定它是否完全是正確的方法。( 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);

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM