Есть ли причина, по которой функции фасета ctype (is
, scan_is
, scan_not
поддерживают только указатель на простой указатель, а не контейнеры на основе итератора, такие как std :: string или даже std :: vector ... тогда можно было бы написать:ctype и строки и контейнеры
const ctype<char>& myctype = use_facet<std::ctype<char> >(locale(""));
string foo_str = "hi there here is a number: 748574 and text again";
vector<char> foo(foo_str.begin(),foo_str.end());
//then one could write
vector<char>::iterator num_begin_it = myctype.scan_is(ctype<char>::digit, foo.begin(), foo.end());
vector<char> foo_num_1(foo, num_begin_it, myctype.scan_not(ctype<char>::digit, num_begin_it, foo.end());
//instead of:
const char* num_begin_pc = myctype.scan_is(ctype<char>::digit, &foo[0], &foo[foo.size()-1]+1); // &foo[foo.size()-1]+1) instead of foo.end() is not quite readable.
vector<char> foo_num_2(num_begin_pc, myctype.scan_not(ctype<char>::digit, num_begin_pc, &foo[foo.size()-1]+1));
//appendix:
//STL/Boost solution, even more verbose:
function<bool(char)> is_digit_func =
bind(
mem_fn(static_cast<bool (ctype<char>::*)(ctype<char>::mask,char) const>(&ctype<char>::is)),
&myctype,
ctype<char>::digit,
_1
);
vector<char>::iterator num_begin_0x = find_if(foo.begin(), foo.end(),is_digit_func);
vector<char> foo_num_3(num_begin_0x,find_if(num_begin_0x, foo.end(),not1(is_digit_func)));
// all 3 foo_num_X will now contain "748574"
Было бы здорово, если бы кто-нибудь имеет некоторое представление о том, почему стандартный комитет сделал эти проектные решения
И есть лучше (= менее многословным) способ использовать из? ctype-функции с контейнерами на основе итератора?
Решение STL/подталкивания будет своего рода хорошо, если это Wouldnt нужно что
Кроме того я обнаружил, что не существует алгоритма copy_if
в стандартной библиотеке, но я уже reason for this.
'std :: basic_string' имеет конструктор, который принимает два' InputIterator's. – Philipp
@Phillip: Вы правы, удалили эту часть. – smerlin