繁体   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