Здравствуйте Аноним, Вы писали:
А>Переворот стринга
А>Но это- поламерски. Как бы это сделать с указателями (вместо string[81])
1) использовать std::string вместо статического массива
2) использовать указатели там, где у тебя индексы
3) использовать системную функцию strrev
(прием 1 несовместим с 2 и 3 — содержимое строки в общем случае не доступно для произвольной записи, а только через обвеску класса string).
В случае std::string преимущества — интеграция с cin/cout, не надо самостоятельно выделять память; недостатки — нет прямого доступа к содержимому строки, что не позволяет сделать оптимизированный алгоритм переворота.
Здравствуйте Кодт, Вы писали: К>1) использовать std::string вместо статического массива
вот мой (ещё один ламерский ) код:
#include<iostream>
#include<string>
void main(void){
std::string string;
char temp;
int len, mid;
std::cout << "Lamer, vvedi string\n";
std::cin >> string;
len = string.size()-1;
mid = len / 2;
for(int i = 0; i <= mid ;i++){
temp = string[i];
string[i] = (char)string[len-i];
string[len-i] = temp;
}
std::cout << string<<"\n";
}
К>2) использовать указатели там, где у тебя индексы
Но по-моему от этого мало чего не изменится (или опять оптимизация за счёт лишней разиндексации?)
вот ещё один кусочек(если кому покритиковать охота ):
вот это самое прямое — нафиг писать то, что уже есть, делает то что нужно и вроде себя зарекомендовало, хотя со вводом char * только лишние мороки, на мой взгляд того не стоящие.
DG>#include <iostream>
DG>#include <string>
DG>void main()
DG>{
DG> std::string s;
DG> std::cout << "> ";
DG> std::cin >> s;
DG> int len = s.size();
DG> char * ss = new char[len+1];
DG> strcpy (ss, s.c_str());
DG> for (char *pb = ss, *pe = ss + len-1; pb < pe;++pb, --pe)
DG> {
DG> std::swap (*pb, *pe);
DG> }
DG> std::cout << ss << std::endl;
DG> delete[] ss;
DG>}
DG>
Клёва, получилась смесь из моих кусков кода, только получше (баг у себя нашёл — нуль на конце забыл в выделении памяти). Только вот спрашивается зачем char* и std::string мешать?
Здравствуйте Курилка, Вы писали:
К>Клёва, получилась смесь из моих кусков кода, только получше (баг у себя нашёл — нуль на конце забыл в выделении памяти). Только вот спрашивается зачем char* и std::string мешать?
А ты предложи мне безглючный способ ввода строки в char*?
Здравствуйте DarkGray, Вы писали:
DG>Здравствуйте Курилка, Вы писали:
К>>Клёва, получилась смесь из моих кусков кода, только получше (баг у себя нашёл — нуль на конце забыл в выделении памяти). Только вот спрашивается зачем char* и std::string мешать?
DG>А ты предложи мне безглючный способ ввода строки в char*?
DG>Или прямой доступ к std::string?
Дак это-то я понимаю, только кривовато получается.
Тогда вопросики (если не трудно):
можно ли этот переворот оптимально итераторами сделать?
и насколько хуже string::operator[] прямого доступа?
Здравствуйте Курилка, Вы писали:
К>Здравствуйте Кодт, Вы писали: К>>1) использовать std::string вместо статического массива
К>вот мой (ещё один ламерский ) код: К>
К>>2) использовать указатели там, где у тебя индексы
К>Но по-моему от этого мало чего не изменится (или опять оптимизация за счёт лишней разиндексации?) К>вот ещё один кусочек(если кому покритиковать охота ): К>
К>>3) использовать системную функцию strrev
К>вот это самое прямое — нафиг писать то, что уже есть, делает то что нужно и вроде себя зарекомендовало, хотя со вводом char * только лишние мороки, на мой взгляд того не стоящие.
)
2. цикл у тебя ну не оптимальный (большую часть вычислений из него можно вынести и избавиться от переменной i, примеры смотри рядом)
Хотя если смысл был избавиться от temp, то ты своего достиг
) К>2. цикл у тебя ну не оптимальный (большую часть вычислений из него можно вынести и избавиться от переменной i, примеры смотри рядом) К>Хотя если смысл был избавиться от temp, то ты своего достиг :)
Ну если придираться так придираться :))
1)
char str[] = "abcde"; //это вовсе не константная строка
//char *cptr = "aaa"; вот это уже константа
2) цикл нормальный (оптимальный). Требует O(n/2) вычислений и перестановок, где n — длина строки. Можно вводить temp-переменные. Тут я с тобой согласен, что быстродействие может увеличиться (а может и нет). Просто это не относится к оптимизации цикла, а к оптимизации кода.
Вот небольшой текстик:
#include <string.h>
void my_reverse(char* str)
{
int len = strlen(str)-1;
for (int b = 0; b < len; b++, len--)
str[b] ^= str[len] ^= str[b]^= str[len];