- 01
- 02
- 03
- 04
- 05
- 06
- 07
- 08
- 09
- 10
- 11
- 12
- 13
- 14
- 15
- 16
- 17
- 18
- 19
- 20
- 21
- 22
- 23
- 24
- 25
- 26
- 27
- 28
- 29
- 30
- 31
- 32
- 33
- 34
- 35
- 36
- 37
- 38
- 39
- 40
- 41
- 42
- 43
- 44
- 45
- 46
- 47
- 48
- 49
- 50
- 51
- 52
- 53
- 54
- 55
- 56
- 57
- 58
- 59
- 60
- 61
- 62
- 63
- 64
- 65
- 66
#include <iostream>
#include <string>
using namespace std;
/*
*/
int change_word(const int begin_pos, string &words, int k, char c)
{
int pos = begin_pos;
int char_count = 0;
bool replaced = false;
while(pos < words.length() && isalpha(words[pos]))
{
char_count++;
if(char_count == k && !replaced)
{
words[pos] = c;
replaced = true;
}
pos++;
}
return pos;
}
void change_words(string &words, int k, char c)
{
int i = 0;
while(i < words.length())
{
if(isalpha(words[i]))
{
i = change_word(i, words, k, c);
}
else
{
i++;
}
}
}
int main()
{
char c = '>';
int k = 0;
string words = "Length of the substring to be copied";
cout << "enter number:";
cin >> k;
change_words(words, k, c);
cout << "changed text: " << words << endl;
return 0;
}
spivti 01.09.2013 19:20 # −2
bormand 01.09.2013 20:57 # +1
Какое это имеет значение?
eth0 01.09.2013 22:07 # +3
kegdan 01.09.2013 21:13 # +1
1024-- 01.09.2013 21:14 # +1
bormand 01.09.2013 21:23 # 0
kegdan 01.09.2013 21:24 # 0
bormand 01.09.2013 21:37 # 0
1024-- 01.09.2013 21:34 # +1
roman-kashitsyn 02.09.2013 07:41 # +1
kegdan 01.09.2013 21:42 # +2
...
i = change_word(i, words, k, c);
Господи, я уж подумал она рекурсивная
wvxvw 02.09.2013 01:32 # +4
lol
wvxvw 02.09.2013 11:19 # 0
roman-kashitsyn 02.09.2013 11:24 # 0
И какое же дефолтное значение должно быть у двух указателей?
wvxvw 02.09.2013 11:28 # 0
defecate-plusplus 02.09.2013 14:22 # 0
2) откуда уверенность, что прямо таки всегда должно быть begin, end? почему не rbegin, rend? или не begin + 1, end - 1
3) единственный недостаток передачи пары итераторов - возможность передачи a.begin(), b.end(), но даже это решается нормальной реализацией оператора ==
4) как ни крути, но без передачи самого контейнера в функцию функция не узнает вообще, от чего собственно ей делать begin и end - особенно, если туда действительно надо передать начальный и конечный указатель
думаем, думаем...
roman-kashitsyn 02.09.2013 14:28 # 0
Но порядок аргументов и значения по умолчанию тут вообще не при чём.
defecate-plusplus 02.09.2013 14:44 # 0
кстати, по личному опыту, range использовал только в крайне вынужденных случаях, так что насчет стандарта это показательно
ну а mpl - это совсем другая тема
roman-kashitsyn 02.09.2013 14:48 # 0
Ну так правильно, зачем кардинально менять то, что неплохо работает. Я сам range ни разу не использовал, ковырял как-то ради интереса после прочтения книжки по MPL. Меня вполне удовлетворяет подход STL.
wvxvw 02.09.2013 15:05 # 0
Почему? Потому что в огромном проценте случаев, эта функция нужна когда у нас уже есть контейнер и нам нужно просмотреть его целиком, а получение итераторов - тупая механическая работа. Кроме того, очень часто случается, что у нас уже есть индексы откуда и до какого места нужно просмотреть. Конвертирование этих индексов в итераторы - опять же, механическая работа засоряющая код.
Т.е. сделано по принципу не чтобы пользователям было удобно, а чтобы разработчику было удобно.
defecate-plusplus 02.09.2013 15:21 # 0
сложнейшая механическая работа, имея vec[x], vec[y], получить итераторы &vec[x], &vec[y], даа
насчет дополнительных шаблонов - таких функций в стл не три, и даже не тридцать
wvxvw 02.09.2013 15:31 # 0
Та хоть три тыщи триста триццать три - какая разница мне, как пользователю? Вам жалко писателей СТЛ? Мне нет, пущай пишут.
Xom94ok 02.09.2013 20:58 # 0
А оставшимся процентам нужно пройтись по подстроке, которую надо предварительно найти; пройтись от начала отсортированного вектора до выполнения некоторого условия; найти что-то в словаре и, если это нашлось, то перед удалением элемента выполнить некоторую логику. Прикажете под каждый случай писать свой алгоритм? Их будет тогда действительно over9000 и это будет ад не только для разработчиков, но и для пользователей, которым придется всё это запоминать.
>>Конвертирование этих индексов в итераторы - опять же, механическая работа
Мне кажется, или это можно сделать один раз, а потом работать только с итераторами? Исходя из моего скромного опыта, код, основанный на использовании итераторов несколько более громоздкий, но... более красивый, что ли?
roman-kashitsyn 03.09.2013 09:24 # +1
Ну просто Степанов хорошо подумал и нашёл универсальный интерфейс, разделил "перпендикулярные" сущности - последовательности и алгоритмы над ними, единственность представления последовательности в виде пары итераторов позволяет композицию алгоритмов большим числом способов. Если тебе уж очень нужно - напиши свой шаблон, делов на 5 секунд. Поганить хорошую концепцию тонной оверлодов - глупо.
wvxvw 02.09.2013 14:40 # 0
spivti 02.09.2013 20:53 # 0
kegdan 02.09.2013 09:47 # +1
1024-- 02.09.2013 10:25 # 0
kegdan 02.09.2013 10:35 # 0
neeedle 02.09.2013 11:32 # 0
neeedle 02.09.2013 11:40 # 0
kegdan 02.09.2013 13:21 # 0
Да так, быстрее, но я делал акцент на вычислении в одну строку)
roman-kashitsyn 02.09.2013 13:23 # 0
kegdan 02.09.2013 13:38 # 0
roman-kashitsyn 02.09.2013 13:53 # +3
kegdan 02.09.2013 13:57 # 0
roman-kashitsyn 02.09.2013 14:00 # 0
kegdan 02.09.2013 14:11 # 0
anonimb84a2f6fd141 02.09.2013 15:11 # +1
neeedle 02.09.2013 14:25 # 0
bormand 02.09.2013 16:40 # +1
Тёмная сторона такая тёмная...
kegdan 02.09.2013 16:55 # 0
neeedle 02.09.2013 13:24 # 0
И я просто хотел показать еще вариант. Ну т.е. в дополнение к вашему. :)
kegdan 02.09.2013 13:40 # 0
эта жа задача во всех возможных вариациях) Даже брейнфак есть)
1024-- 02.09.2013 14:05 # 0
А тут как раз бы char* всех зарешал, особенно с авторским change_word. Без богомерзких копирований строки, без богомерзких length.
roman-kashitsyn 02.09.2013 14:09 # 0
anonimb84a2f6fd141 02.09.2013 15:11 # 0
bormand 02.09.2013 16:59 # 0
Ну где еще Царствуют? :)
1024-- 02.09.2013 19:13 # 0
spivti 02.09.2013 18:09 # 0
Это как раз с++, с char* да, все было бы даже проще. Хотя, моя цель более менее освоить STL, а там объекты нада юзать.
1024-- 02.09.2013 19:24 # 0
Я сначала подумал, что в change_word какая-то тяжёлая наркомания (цикломания) - какие-то переменные, условия... Но котом понял, что если оставлять один цикл, переменная нужна, а на два может и компилятор разделит, оптимизируя, и уберёт лишнее.
kegdan 15.09.2013 07:50 # +1
bormand 15.09.2013 09:01 # 0
А в руби нет какого-нибудь each у строки, чтобы не городить этот .length.times?
kegdan 15.09.2013 09:48 # 0
bormand 15.09.2013 09:15 # 0
kegdan 15.09.2013 09:49 # 0
kegdan 15.09.2013 09:53 # 0
спешу просто
kegdan 15.09.2013 10:03 # 0
Что бы строку возвращал, а не массив
bormand 15.09.2013 11:42 # 0
kegdan 15.09.2013 11:48 # 0
bormand 15.09.2013 11:49 # 0
А в руби все подряд мутабельное и по ссылке передается? Даже строки, даже числа, даже аллах?
kegdan 15.09.2013 11:52 # +1
spivti 15.09.2013 17:33 # 0
Лично мне сам руби показался сильно путанным,хотя кому как.
kegdan 15.09.2013 19:53 # 0
bormand 15.09.2013 19:59 # 0
Язык для диабетиков ;)
kegdan 15.09.2013 20:22 # 0
bormand 15.09.2013 12:00 # +3
kegdan 15.09.2013 12:07 # 0
! - метод меняет обьект. ? - предикат. очень удобно, кстати. Только непривычно, что методы не в CamelCase именуются
guest 03.03.2014 03:01 # +3
bormand 15.09.2013 09:25 # 0
cyperh 03.03.2014 00:20 # 0
fixed