我正在尝试使用存储在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();
}
如何使用迭代器获取std :: list中的“the-next-item”?我希望它是一个链接列表,为什么我不能进入下一个项目?
答案 0 :(得分:15)
您无法执行it + N
,因为您没有列表迭代器的随机访问权限。您只能使用列表迭代器一次执行一个步骤(这些是双向迭代器)。
您可以使用boost::next
和boost::prior
// Lookahead in list to see if next element is end
if(boost::next(iterItems) == dilList.end())
{
或者你可以在之前打印逗号:
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();
}
答案 1 :(得分:12)
我认为列表迭代器是双向的,但不是随机访问。这意味着您可以执行++和 - 但不能添加或减去。
要获取下一个迭代器,请复制并递增它。
答案 2 :(得分:6)
另一个解决方案是让第一个条目成为特殊情况,而不是最后一个条目:
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();
}
答案 3 :(得分:2)
您可以使用以下方法完全避免此问题:
std::string Compose(DataItemList& dilList)
{
std::stringstream ssDataSegment;
for(iterItems = dilList.begin(); iterItems != dilList.end(); iterItems++)
{
ssDataSegment << (*iterItems)->ToString() << ","; // always write ","
}
std::string result = ssDataSegment.str();
return result.substr(0, result.length()-1); // skip the last ","
}
首先为所有元素(即使是最后一个元素)写“,”。然后,使用substr
删除不需要的最后一个“,”。这另外可以产生更清晰的代码。
答案 4 :(得分:1)
又一种可能性:
#include "infix_iterator.h"
#include <sstream>
typedef std::list<shared_ptr<EventDataItem> > DataItemList;
std::string Compose(DataItemList const &diList) {
std::ostringstream ret;
infix_ostream_iterator out(ret, ",");
for (item = diList.begin(); item != diList.end(); ++item)
*out++ = (*item)->ToString();
return ret.str();
}
您可以从Google的Usenet存档(或各种网站)获取infix_iterator.h。
答案 5 :(得分:1)
注意:从C ++ 11开始,您可以使用 std :: next 和 std :: prev 。