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

feng

我正在尝试通过container <\ T>(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;
}

我希望评论行

string s(s1.begin(),iter);

创建一个范围为[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);
       ^ ~~~~~~~~~~~~~~~

尽管

string s(s1.begin(),s1.begin+3); 

确实创建了一个子字符串。

为什么

string s(s1.begin(),iter);

不工作?

非常感谢!

阿米·塔沃里(Ami Tavory)

例如,如果您在这里查看,您会看到一条完整的错误消息,其中包含

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&)'

这表示它认为您在调用采用iteratorand(引用)的构造函数const_iterator没有这样的构造函数。由于s1是非常量对象,因此s1.begin()返回常规迭代器。

有很多解决方法。其中之一是将循环更改为

    string::const_iterator b = s1.begin();
    for (string::const_iterator iter = b;
            iter != s1.end()-1; ++iter)
    {
        string s(b,iter);
        ...

在这里,您确实使用了两个const迭代器(请参见此处的预期输出)。


编辑

两种出色的(和优越的)替代方案是:

  1. 使用cbegin,如果你是C ++ 11启用(@rici)

  2. accumulate一旦使用了该算法,请使用,(@ PaulMcKenzie)

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章