Я пытаюсь создать подконтейнеры контейнера через контейнер < \ T> (InputIt First, InputIt Last). Например, у меня есть строка s1 = «AreYouOK». Ожидаемые выходыИнициализация последовательного контейнера C++ с использованием итератора
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);
для создания подстроки s из строки s1 в диапазоне [s1.begin(), iter), так как 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);
не работает?
Большое спасибо!
's1.begin()' возвращает 'iterator', а' iter' - 'const_iterator'. Ни один из конструкторов не принимает пару (итератор, const_iterator). –
Вы могли бы избежать этого, если бы использовали [std :: accumulate] (http://ideone.com/yaSA8m) – PaulMcKenzie