C++11 C++;使用迭代器的顺序容器初始化

C++11 C++;使用迭代器的顺序容器初始化,c++11,iterator,containers,C++11,Iterator,Containers,我试图通过容器(InputIt First,InputIt Last)创建容器的子容器。例如,我有一个字符串s1=“AreYouOK”。 预期产出如下: A Ar Are AreY AreYo AreYou AreYouO 这是我的密码: #include <vector> #include <string> #include <iostream> using std::vector; using std::string; using std::cout;

我试图通过容器(InputIt First,InputIt Last)创建容器的子容器。例如,我有一个字符串s1=“AreYouOK”。 预期产出如下:

A
Ar
Are
AreY
AreYo
AreYou
AreYouO
这是我的密码:

#include <vector>
#include <string>
#include <iostream>

using std::vector;
using std::string;
using std::cout;
using std::cin;
using std::endl;

int main()
{
    string s1 = "AreYouOK";
    vector<string> v;

    for (string::const_iterator iter = s1.begin();
            iter != s1.end()-1; ++iter)
    {
        string s(s1.begin(),iter); // no matching container
        s += *iter;
        v.push_back(s);
    }

    for (vector<string>::const_iterator iter = v.begin();
            iter != v.end(); ++iter)
    {
        cout << *iter <<endl;
    }

    return 0;
}
在[s1.begin(),iter]范围内创建字符串s1的子字符串s,因为iter是s1的迭代器。但是,有人告诉我,初始化时没有匹配的构造函数

error: no matching constructor for initialization of 'string' 
(aka 'basic_string<char, char_traits<char>, allocator<char> >')
string s(s1.begin(),iter);
       ^ ~~~~~~~~~~~~~~~
已成功创建子字符串

为什么

没用

非常感谢!

例如,如果您查看,您可以看到完整的错误消息包含

prog.cpp:19:33: error: no matching function for call to 'std::basic_string<char>::basic_string(std::basic_string<char>::iterator, std::basic_string<char>::const_iterator&)'
在这里,您确实使用了两个常量迭代器(请参见预期的输出)


编辑

两个优秀(且更优秀)的备选方案是:

  • 如果启用了C++11(@rici),请使用
    cbegin

  • 使用
    累计
    ,一旦你使用了该算法(@PaulMcKenzie)


  • s1.begin()
    返回一个
    迭代器
    ,而
    iter
    是一个
    const\u迭代器
    。没有一个构造函数采用(迭代器,const\u迭代器)对。如果使用,可以避免这种情况,只是将其更改为
    字符串s(s1.cbegin(),iter)会更简单吗
    @rici这是一个很好的观点,但它没有标记为C++11,因此如果OP有,请拨打IDK。不过,我会将其作为注释添加。谢谢。
    string s(s1.begin(),s1.begin+3); 
    
    string s(s1.begin(),iter);
    
    prog.cpp:19:33: error: no matching function for call to 'std::basic_string<char>::basic_string(std::basic_string<char>::iterator, std::basic_string<char>::const_iterator&)'
    
        string::const_iterator b = s1.begin();
        for (string::const_iterator iter = b;
                iter != s1.end()-1; ++iter)
        {
            string s(b,iter);
            ...