Что не так со следующим кодом? - PullRequest
0 голосов
/ 17 апреля 2010
#include <iostream>
#include <string>
using namespace std;
int main(void)
{
    string a;
    cin>>a;
    a.erase(a.end()-1);
    a.erase(a.begin()+1);
    string ge = "oae";
    a.insert(a.begin()+1, ge);
    cout<<a<<endl;
    return 0;
}

Он не компилируется, и я не знаю почему. Можете ли вы сказать мне, что не так

Ответы [ 4 ]

3 голосов
/ 17 апреля 2010

http://www.cplusplus.com/reference/string/string/insert/

string& insert ( size_t pos1, const string& str );
 string& insert ( size_t pos1, const string& str, size_t pos2, size_t n );
 string& insert ( size_t pos1, const char* s, size_t n);
 string& insert ( size_t pos1, const char* s );
 string& insert ( size_t pos1, size_t n, char c );
iterator insert ( iterator p, char c );
    void insert ( iterator p, size_t n, char c );
template<class InputIterator>
    void insert ( iterator p, InputIterator first, InputIterator last );

Ваш звонок на std::basic_string<t>::insert не соответствует ни одной из перечисленных выше перегрузок.

a.insert(a.begin()+1, ge);

должно быть

a.insert(a.begin()+1, ge.begin(), ge.end());

или

a.insert(1, ge);

В противном случае этот код недействителен.

1 голос
/ 17 апреля 2010

Нет перегрузки std::string::insert(), которая принимает итератор и string набор параметров. Вместо этого вы можете использовать:

a.insert( 1, ge);   // use an index and a string

или

a.insert( a.begin()+1, ge.begin(), ge.end());  // use an destination iterator, and 
                                               //  a set of iterators indicating a range

Обратите внимание, что это позволит вашему коду компилироваться, но могут возникнуть некоторые проблемы во время выполнения, такие как:

  • если a - пустая строка, то a.end()-1 не определено
  • если a - пустая строка, то a.begin()+1 аналогично не определено
1 голос
/ 17 апреля 2010

Рабочая версия:

#include <iostream>
#include <string>
using namespace std;
int main(void)
{
    string a;
    cin>>a;
    a.erase(a.end()-1);
    a.erase(a.begin()+1);
    string ge = "oae";
    a.insert(1, ge);          // here
    cout<<a<<endl;
    return 0;
}
1 голос
/ 17 апреля 2010

a.insert(a.begin()+1, ge); это проблема.

Функция string::insert принимает int в качестве первого параметра, и вы передаете итератор. Что ты пытаешься сделать?

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...