[英]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.