|
> ファイルの内容を最初に全部読みこんじゃってもいいけど
> より汎用的に作るには、読みこみながら探す方が良く
> それだと search は使えないですね。
まるっと読んだら負けかなと思ってみるテスト:
#include <sstream>
#include <iomanip>
#include <deque>
#include <iterator>
#include <algorithm>
template<typename InputIterator1,
typename InputIterator2,
typename InputIterator3,
typename OutputIterator>
OutputIterator replace_s(InputIterator1 first, InputIterator1 last,
InputIterator2 pattern_first, InputIterator2 pattern_last,
InputIterator3 replace_first, InputIterator3 replace_last,
OutputIterator out) {
std::deque<std::iterator_traits<InputIterator1>::value_type>::size_type pattern_size
= std::distance(pattern_first, pattern_last);
std::deque<std::iterator_traits<InputIterator1>::value_type> que;
for ( ; first != last; ++first ) {
que.push_back(*first);
if ( que.size() > pattern_size ) {
*out++ = que.front();
que.pop_front();
}
if ( que.size() == pattern_size && std::equal(pattern_first, pattern_last, que.begin()) ) {
out = std::copy(replace_first, replace_last, out);
que.clear();
}
}
return std::copy(que.begin(), que.end(), out);
}
/* おためし:
このソース自身を標準入力に食わせ、
"InputIterator" を "入力イテレータ"
に置換してみよぉ!
*/
#include <iostream>
int main() {
std::istreambuf_iterator<char> first(std::cin);
std::istreambuf_iterator<char> last;
std::string pattern = "InputIterator";
std::string replace = "入力イテレータ";
replace_s(first, last,
pattern.begin(), pattern.end(),
replace.begin(), replace.end(),
std::ostream_iterator<char>(std::cout));
}
|