我正在尝试通过容器< \ 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,因为它是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);
不起作用?
非常感谢!
答案 0 :(得分:1)
例如,如果查看here,则可以看到包含
的完整错误消息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&)'
表示它认为您调用的构造函数需要iterator
和(引用)const_iterator
。没有这样的构造函数。由于s1
是非const对象,s1.begin()
返回常规迭代器。
有很多方法可以解决这个问题。其中之一就是将你的循环改为
string::const_iterator b = s1.begin();
for (string::const_iterator iter = b;
iter != s1.end()-1; ++iter)
{
string s(b,iter);
...
这里确实使用了两个const迭代器(参见here您的预期输出)。
修改强>
两个优秀(和更优秀)的替代方案是:
如果您启用了C ++ 11(@rici),请使用cbegin
使用accumulate
,一旦达到该算法(@PaulMcKenzie)