如何使用 reverse_iterator 插入
Posted
技术标签:
【中文标题】如何使用 reverse_iterator 插入【英文标题】:How do you insert with a reverse_iterator 【发布时间】:2008-11-19 00:33:38 【问题描述】:我想在 C++ 的 STL 列表中插入一些东西,但我只有一个反向迭代器。完成此操作的常用方法是什么?
这行得通:(当然可以)
std::list<int> l;
std::list<int>::iterator forward = l.begin();
l.insert(forward, 5);
这不起作用:(我应该怎么做?)
std::list<int> l;
std::list<int>::reverse_iterator reverse = l.rbegin();
l.insert(reverse, 10);
【问题讨论】:
【参考方案1】:l.insert(reverse.base(), 10);
将在末尾插入“10”,给定您对“反向”迭代器的定义。实际上,l.rbegin().base() == l.end()
。
【讨论】:
【参考方案2】:基本上,你不知道。请参阅 TCPPPL 中的 19.2.5。
reverse_iterator
有一个名为base()
的成员,它将返回一个“常规”迭代器。因此,以下代码将适用于您的示例:
l.insert(reverse.base(), 10);
但要小心,因为base()
方法会在原始reverse_iterator
指向之后返回元素。 (这样指向rbegin()
和rend()
的reverse_iterators 才能正常工作。)
【讨论】:
【参考方案3】:以防万一它有帮助,因为这是搜索的第一次点击,这里是一个使用 rbegin
的工作示例。这应该比使用std::stringstream
或sprint
更快。在某些打印工作中,我挑衅地呼叫成员fmt_currency
数千次。 std::isalnum
用于处理减号。
std::wstring fmt_long(long val) //for now, no options? Just insert commas
std::wstring str(std::to_wstring(val));
std::size_t pos 0 ;
for (auto r = rbegin(str) + 1; r != str.rend() && std::isalnum(*r); ++r)
if (!(++pos % 3))
r = std::make_reverse_iterator(str.insert(r.base(), L','));
return str;
【讨论】:
以上是关于如何使用 reverse_iterator 插入的主要内容,如果未能解决你的问题,请参考以下文章
在遍历中使用 iterator/reverse_iterator 进行 Erase 的用法