簡體   English   中英

c ++迭代器循環與索引循環

[英]c++ iterator loop vs index loop

我知道這是一個非常愚蠢的問題,但我想澄清一下。

假設我有一個字符串向量,

vector<int> vnTemp; // suppose this vector has {1,2,3,4,5}
vector<int>::iterator vn_it;

//Now, I want to print out only 1 to 4.
for(int i=0; i<4; ++i)
    cout << vnTemp[i] << endl;

非常簡單。 但是當我想通過使用迭代器打印出相同的結果時,我該怎么辦? 例如,

// .. continuing from the code above
for(vn_it = vnTemp.begin(); vn_it != vnTemp.end()-1; ++vn_it)
    cout << *it << endl;

當然, vnTemp.end()-1會導致錯誤,因為它是指針。

在這種情況下,循環的等價物是什么? 當它們都以優化(-o)模式編譯時是否有任何性能差異?


編輯:

我剛剛意識到這實際上適用於vector 當我使用boost::tokenizer時,問題發生了,代碼是這樣的:

typedef boost::tokenizer<boost::char_separator<char> > tokenizer;

boost::char_separator<char> sep("_");
tokenizer::iterator tok_it;

tokenizer tokens(strLine, sep); //strLine is some string line
for(tok_it=tokens.begin(); tok_it != tokens.end(); ++tok_it){
... }

這是原始代碼,當我嘗試在for循環中說出tokens.end()-1時會發生錯誤。

有什么辦法可以解決這個問題嗎? 抱歉模棱兩可。

boost::tokenizer只提供一個前向迭代器; 這意味着你不能從tokenizer迭代器中減去。 如果您希望循環避免處理最后一個令牌,則在處理您所使用的令牌之前,您必須“向前看”。 像這樣的東西

tokenizer tokens(strLine, sep); //strLine is some string line
tok_it = tokens.begin();
if(tok_it!=tokens.end())
{
    ++tok_it;
    for(auto last_tok = tokens.begin(); tok_it != tokens.end(); ++tok_it){
        // Process last_tok here
        . . .
       last_tok = tok_it;    
    }
}

編輯:另一種方法是將令牌復制到具有更靈活迭代器的容器中:

std::vector<std::string> resultingTokens(tokens.begin(), tokens.end());
for(auto tok=resultingTokens.begin(); tok!=resultingTokens.end()-1; ++tok)
{
    // whatever
}

暫無
暫無

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

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