J. *_*fer 9 c++ iterator stl list
我正在尝试使用存储在std :: list中的数据元素来构建一个字符串,我希望逗号只放在元素之间(即,如果元素是列表中的{A,B,C,D},结果字符串应该是"A B C D".
此代码不起作用:
typedef std::list< shared_ptr<EventDataItem> > DataItemList;
// ...
std::string Compose(DataItemList& dilList)
{
std::stringstream ssDataSegment;
for(iterItems = dilList.begin();
iterItems != dilList.end();
iterItems++)
{
// Lookahead in list to see if next element is end
if((iterItems + 1) == dilList.end())
{
ssDataSegment << (*iterItems)->ToString();
}
else
{
ssDataSegment << (*iterItems)->ToString() << ",";
}
}
return ssDataSegment.str();
}
Run Code Online (Sandbox Code Playgroud)
如何使用迭代器获取std :: list中的"the-next-item"?我希望它是一个链表,为什么我不能进入下一个项目?
Joh*_*itb 15
您不能这样做,it + N
因为您没有列表迭代器的随机访问权限.您只能使用列表迭代器一次执行一个步骤(这些是双向迭代器).
你可以使用boost::next
和boost::prior
// Lookahead in list to see if next element is end
if(boost::next(iterItems) == dilList.end())
{
Run Code Online (Sandbox Code Playgroud)
或者你可以在之前打印逗号:
std::string Compose(DataItemList& dilList)
{
std::stringstream ssDataSegment;
for(iterItems = dilList.begin();
iterItems != dilList.end();
++iterItems)
{
if(iterItems != diList.begin())
ssDataSegment << ",";
ssDataSegment << (*iterItems)->ToString();
}
return ssDataSegment.str();
}
Run Code Online (Sandbox Code Playgroud)
另一个解决方案是让第一个条目成为特殊情况,而不是最后一个条目:
std::string Compose(DataItemList& dilList)
{
std::stringstream ssDataSegment;
for(iterItems = dilList.begin();
iterItems != dilList.end();
++iterItems)
{
// See if current element is the first
if(iterItems == dilList.begin())
{
ssDataSegment << (*iterItems)->ToString();
}
else
{
ssDataSegment << "," << (*iterItems)->ToString();
}
}
return ssDataSegment.str();
}
Run Code Online (Sandbox Code Playgroud)