如何使用 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() 的r​​everse_iterators 才能正常工作。)

【讨论】:

【参考方案3】:

以防万一它有帮助,因为这是搜索的第一次点击,这里是一个使用 rbegin 的工作示例。这应该比使用std::stringstreamsprint 更快。在某些打印工作中,我挑衅地呼叫成员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 插入的主要内容,如果未能解决你的问题,请参考以下文章

正反向迭代器

使用 reverse_iterator 擦除最后一个元素

reverse_iterator

在遍历中使用 iterator/reverse_iterator 进行 Erase 的用法

对于std :: reverse_iterator c ++,operator!=不明确

C++ rbegin 修改reverse_iterator的地址