是否有用于 C 字符串的标准 C++ 迭代器?

lve*_*lla 5 c++ string iterator c++11

有时我需要使用通用 C++ 迭代器范围接口将 C 字符串传递给函数[first, last)。是否有适用于这些情况的标准 C++ 迭代器类,或者无需复制字符串或调用的标准方法strlen()

编辑:我知道我可以使用指针作为迭代器,但我必须知道字符串在哪里结束,什么需要我调用strlen().

EDIT2:虽然我不知道这样的迭代器是否标准化,但我当然知道这是可能的。回应讽刺的答案和评论,这是存根(不完整,未经测试):

class CStringIterator
{
public:
    CStringIterator(char *str=nullptr):
        ptr(str)
    {}

    bool operator==(const CStringIterator& other) const
    {
        if(other.ptr) {
            return ptr == other.ptr;
        } else {
            return !*ptr;
        }
    }

    /* ... operator++ and other iterator stuff */

private:
    char *ptr;
};
Run Code Online (Sandbox Code Playgroud)

EDIT3:具体来说,我对前向迭代器感兴趣,因为我想避免在 sring 上迭代两次,因为我知道算法只需要执行一次。

Ric*_*ges 5

事实上,是的——有点。在c++17中。

C++17 引入了std::string_view可以从 C 风格字符串构造的函数。

std::string_view是一个随机访问(代理)容器,当然完全支持迭代器。

const char*请注意,虽然理论上从 a 构造 string_view会调用std::strlen,但是当编译器在编译时知道字符串的长度时,允许编译器(gcc 当然也这样做)忽略该调用。

例子:

#include <string_view>
#include <iostream>

template<class Pointer>
struct pointer_span
{
    using iterator = Pointer;

    pointer_span(iterator first, std::size_t size)
    : begin_(first)
    , end_(first + size)
    {
    }

    iterator begin() const { return begin_; }
    iterator end() const { return end_; }

    iterator begin_, end_;
};

int main(int argc, char** argv)
{
    for(auto&& ztr : pointer_span(argv, argc))
    {
        const char* sep = "";
        for (auto ch : std::string_view(ztr))
        {
            std::cout << sep << ch;
            sep = " ";
        }
        std::cout << std::endl;
    }
}
Run Code Online (Sandbox Code Playgroud)

请参阅此处的示例输出


Tom*_*Tom 1

恐怕不是,最后您需要一个指向您需要调用的字符串末尾的指针strlen