Anti-Antidote Ответов: 1

'Replace' from & lt;algorithm> не работает корректно


По какой-то причине replace шаблон из <algorithm> не хочет работать на меня. См. пример кода ниже:

#include <iostream>
#include <string>
#include <algorithm>
using namespace std;

int main() {
	string s = "Hello, world!";
	replace(s.begin(), s.end(), "l", "i");
	cout << s << endl;
	return 0;
}


Синтаксических ошибок в коде нет, но компилятор все равно выдает мне следующие ошибки:

In file included from /usr/include/c++/4.9/algorithm:62:0,
                 from prog.cpp:3:
/usr/include/c++/4.9/bits/stl_algo.h: In instantiation of 'void std::replace(_FIter, _FIter, const _Tp&, const _Tp&) [with _FIter = __gnu_cxx::__normal_iterator<char*, std::basic_string<char> >; _Tp = char [2]]':
prog.cpp:8:38:   required from here
/usr/include/c++/4.9/bits/stl_algo.h:4234:15: error: ISO C++ forbids comparison between pointer and integer [-fpermissive]
  if (*__first == __old_value)
               ^
/usr/include/c++/4.9/bits/stl_algo.h:4235:13: error: invalid conversion from 'const char*' to 'char' [-fpermissive]
    *__first = __new_value;
             ^


Спасибо всем!

Что я уже пробовал:

Я пробовал несколько версий этого, но, похоже, ничего не работает. Google просто дает мне шаблон, который я уже знаю.

1 Ответов

Рейтинг:
1

Jochen Arndt

Ваш звонок replace(iterator, iterator, const char*, const char *) не соответствует std::replace шаблон:

template<typename _FIter, typename _Tp>
  void
  replace(_FIter, _FIter, const _Tp&, const _Tp&);

_Tp является char здесь потому что std::string итераторы указывают на char.

Поэтому вы должны использовать
replace(s.begin(), s.end(), 'l', 'i');


Anti-Antidote

... нужно ли мне использовать char s скорее, чем string s?

Jochen Arndt

Нет.

Вы все еще не поняли. Я постараюсь объяснить это по-другому:

Шаблон replace() работает с итератором и соответствующим типом.
Прежде всего нужно понять, что такое итератор. От http://www.cplusplus.com/reference/iterator/:

"Итератор - это любой объект, который, указывая на некоторый элемент в диапазоне элементов (например, массив или контейнер), имеет возможность перебирать элементы этого диапазона с помощью набора операторов (по крайней мере, с операторами инкремента ( ++ ) и разыменования ( * ))."

В случае std:: string у вас есть массив символов. Таким образом, тип (_Tp) - это char.

Или просто подумайте о том, что вы получаете при использовании итератора для доступа к элементу:

std:: string s = " Привет, мир!";
cout << "первый символ-это" < & lt; *s. begin() < & lt; endl;

Anti-Antidote

Использование *s. begin () и *s. end() не работает для меня... я все еще делаю это неправильно?