以下代码有什么问题?

时间:2010-04-16 21:47:08

标签: c++ string

#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 个答案:

答案 0 :(得分:3)

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 :(得分:1)

a.insert(a.begin()+1, ge);就是问题所在。

string::insert函数将int作为第一个参数,并且您将传入迭代器。你想做什么?

答案 2 :(得分:1)

工作版:

#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;
}

答案 3 :(得分:1)

没有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同样未定义