Модераторы: Daevaorn

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Нужна замена для std::string, Нужна замена для std::string 
V
    Опции темы
andrew_121
Дата 15.6.2008, 01:56 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Нужна замена для std::string.
Работаю над программой, с приогромнейшим кол-вом строковых операций.
Юзать "algorithm"-ы терпения не хватает.
Кто нибудь, если есть сей класс, поделитесь, ну хоть ссылочкой.
Спасибо.

Это сообщение отредактировал(а) andrew_121 - 15.6.2008, 01:57


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
anatox91
Дата 15.6.2008, 09:23 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



ну наваляй что-то типа такого:
Код

#include <iostream>
#include <cctype>
#include <string>
#include <cstring>
#include <cstdio>
class cstring {
      char *string;
      unsigned int len;
public:
       enum CaseSensitivity { CaseSensitive = 1, CaseInsensitive = 2 };
       cstring() {
                 len = 0;
                 string =0;
                  }
       cstring(const char *str){
                    len = strlength(str); 
                    string = new char[len + 1];
                    unsigned int i=0;
                    for(; str[i]; ++i) {
                            string[i] = str[i];
                            }
                    string[i] = '\0';
                    }
       cstring(const cstring &copy) {
                     len = copy.len;
                     string = new char[len + 1];
                     unsigned int k=0;
                     for(; copy.string[k]; ++k) {
                           string[k] = copy.string[k];
                           }
                     string[k] = '\0';
                     }
       ~cstring() {
                  if(!len) 
                  delete[] string;
                  }
       void show() const {
            for(unsigned int i=0; i < len; ++i) 
                         std::cout << string[i];       
            } 
       void clear() {
            len = 0;
            delete[] string;
            }
protected:
       static int strlength(const char *array) { 
           int length=0;
           for(int j=0; array[j]; ++j) length++;
           return length;
           }
public:
       int size() const { 
           return len;
           }
       bool isEmpty() const {
            return !len ? true : false;
            }
       char at(int i) const { 
            return len ? string[i] : 0 ;
            }
       friend std::ostream &operator<<(std::ostream& out, const cstring &obj) { 
              out << obj.string;
              return out;
              }
       friend std::istream &operator>>(std::istream& in, cstring &obj) {
              //std::string
              std::string s;
              in >> s;
              obj.len = s.size ();
              obj.string = new char[obj.len+1];
              strcpy (obj.string, s.c_str());
              return in;
              }
       cstring &operator=(const cstring &other) {
               if(len) delete[] string;
               len = other.len;
               string = new char[len + 1];
               unsigned int k=0;
               for(; other.string[k]; k++) {
                          string[k] = other.string[k];
                           }
               string[k] = '\0';
               return *this;
               }
       cstring &operator=(const char *str) {
               if(len) delete[] string;
               len = strlength(str); //my function for count string length
               string = new char[len + 1];
               unsigned int i=0;
               for(; str[i]; i++) {
                            string[i] = str[i];
                            }
               string[i] = '\0';
               return *this;
               }
       cstring &append(const char *str) {
               if(!len) {
                        len = strlength(str); //my function for count string length
                        string = new char[len + 1];
                        unsigned int i=0;
                        for(; i < len; i++) {
                              string[i] = str[i];
                              }
                        string[i] = '\0';
                        return *this;
                        }
               else {
                    len += strlength(str);
                    char *buf = new char[len+1]; //creating buffer for copy string
                    unsigned int k=0; //iterator
                    for(; string[k]; k++) buf[k] = string[k]; //copying string to buffer
                    
                    unsigned int c=0;
                    for(; k < len; k++, c++) { 
                          buf[k] = str[c];
                          }
                    buf[k] = '\0'; //add null
                    string = buf;
                    return *this; //return new object
                    }
               }
       cstring &append(const cstring &other) {
               if(other.len) {
                             this->append(other.string);
                             return *this;
                             }
               }
       cstring &append(char ch) {
               if(!len) {
                        len = 1;
                        string = new char[2];
                        string[0] = ch;
                        string[1] = '\0';
                        return *this;
                        }
               else {
                    ++len;
                    char *buf = new char[len+1]; //creating buffer for copy string
                    unsigned int k=0; //iterator
                    for(; string[k]; k++) buf[k] = string[k]; //copying string to buffer
                    
                    delete[] string; //deleting old string
                    
                    buf[k] = ch;
                    buf[++k] = '\0';
                    string = buf;
                    return *this;
                    }
               }
       bool compare(const cstring &other) const {
            if(len != other.len) return false;
            for(unsigned int i=0; i < len; i++) {
                    if(string[i] != other.string[i]) return false;
                    }
            return true;
            }
       bool compare(const char* str) const {
            if(len != strlength(str)) return false;
            for(unsigned int i=0; i < len; i++) {
                         if(string[i] != str[i]) return false;
                         }
            return true;
            }
       bool compare(const char *str, CaseSensitivity cs) const {
            if(cs == CaseInsensitive) {
                  if(len != strlength(str)) return false;
                  for(unsigned int i=0; i < len; i++) {
                               if(tolower(string[i]) != tolower(str[i])) return false;
                               }
                  return true;
                  }
            else {
                 if(len != strlength(str)) return false;
                 for(unsigned int i=0; i < len; i++) {
                         if(string[i] != str[i]) return false;
                         }
                 return true;
                 }
            }
       bool compare(const cstring &other, CaseSensitivity cs) const {
            if(cs == CaseInsensitive) {
                  if(len != other.len) return false;
                  for(unsigned int i=0; i < len; i++) {
                               if(tolower(string[i]) != tolower(other.string[i])) return false;
                               }
                  return true;
                  }
            else {
                 if(len != other.len) return false;
                 for(unsigned int i=0; i < len; i++) {
                    if(string[i] != other.string[i]) return false;
                    }
                 return true;
                 }
            }
       bool operator==(const cstring &other) const {
            return (this->compare(other));
            }
       bool operator==(const char *str) const {
            return (this->compare(str));
            }
       bool contains(char ch) const {
            for(size_t i=0; i < len; i++) {
                       if(string[i] == ch) return true;
                       }
            return false;
            }             
       bool operator!=(const cstring &other) const {
            return (!this->compare(other));
            }
       bool operator!=(const char *str) const {
            return (!this->compare(str));
            }
       cstring &operator+=(const char *str) {
               if(strlength(str)) {
                                  this->append(str);
                                  return *this;
                                  }
               }
       cstring &operator+=(const cstring& other) {
               if(other.len) {
                             this->append(other.string);
                             return *this;
                             }
               }
       cstring &operator+=(char ch) {
               if(ch) {
                      this->append(ch);
                      return *this;
                      }
               }
       bool operator<(const char *str) const {
            return (len < strlength(str));
            } 
       bool operator<(const cstring &other) const {
            return (len < other.len);
            } 
       bool operator<=(const char *str) const {
            return (len <= strlength(str));
            } 
       bool operator<=(const cstring &other) const {
            return (len <= other.len);
            }
       bool operator>(const char *str) const {
            return (len > strlength(str));
            }
       bool operator>(const cstring& other) const {
            return (len > other.len) ;
            }
       bool operator>=(const char *str) const {
            return (len >= strlength(str));
            }
       bool operator>=(const cstring& other) const {
            return (len >= other.len);
            }
       cstring operator+(const cstring &s2) {
               this->append(s2);
               return *this;
               }
       cstring operator+(const char *str) {
               this->append(str);
               return *this;
               }
       friend cstring operator+(const char *str, const cstring &other) {
               cstring s;
               s.append(str).append(other);
               return s;
               }
       cstring operator+(char ch) {
             this->append(ch);
             return *this;
             }
       friend cstring operator+(char ch, const cstring &other) {
              cstring s;
              s.append(ch).append(other);
              return s;
              }  
};

 smile 

блин, че-то [code=cpp] не работает или это у меня только такие глюки?

Это сообщение отредактировал(а) anatox91 - 15.6.2008, 09:47


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
bronislav
Дата 15.6.2008, 09:26 (ссылка) |    (голосов:3) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 334
Регистрация: 29.1.2008
Где: Украина::Донецк

Репутация: нет
Всего: 3



А чем тебя не устраивает std::string?




--------------------
user posted image
иногда проще и быстрей обойти лужу, даже если кажется что она мелкая и путь напрямик короче - ведь она может скрывать открытый люк (с) mes
PM MAIL   Вверх
andrew_121
Дата 15.6.2008, 10:07 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



anatox91 - Думал что я не один такой, кого std::string неустраивает. Да, похоже придется ваять нечто STL совместимое.

Добавлено через 1 минуту и 8 секунд
bronislav - Да функционал никакой! Вот QString - это тема!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
yar
Дата 15.6.2008, 10:23 (ссылка) |    (голосов:2) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 101
Регистрация: 8.9.2007
Где: Одесса, Украина

Репутация: нет
Всего: 8



std::string можно использовать с Boost String Algorithms Library.. 
Там много дополнительного функционала, не включённого в STL.

--------------------
Если бы строители возводили здания так, как программисты пишут программы, первый же дятел уничтожил бы мировую цивилизацию.Джеральд Вайнберг
PM MAIL WWW   Вверх
anatox91
Дата 15.6.2008, 10:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


программист-самоучка
**


Профиль
Группа: Участник
Сообщений: 699
Регистрация: 12.1.2008
Где: ++Украина.Крым++

Репутация: нет
Всего: 13



Цитата(andrew_121 @  15.6.2008,  10:07 Найти цитируемый пост)
Вот QString - это тема!

насчет этого согласен  smile 


--------------------

The code is the design ©

Sony VAIO VGN-FW480J

user posted image
PM MAIL ICQ   Вверх
Lazin
Дата 15.6.2008, 11:43 (ссылка)  | (голосов:6) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



Цитата(andrew_121 @  15.6.2008,  10:07 Найти цитируемый пост)
Да функционал никакой! Вот QString - это тема! 

QString это BLOB(антипаттерн)
алгоритмы + boost и QString нервно курит в сторонке, string конечно то-же огромен, но там практичесски нет функционала для обработки строк, это предпологается делать средствами STL, которые пора-бы уже и знать smile  
к тому-же QString только Unicode, иногда нужен ASCII
PM MAIL Skype GTalk   Вверх
andrew_121
Дата 15.6.2008, 11:49 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Lazin
Цитата

QString это BLOB(антипаттерн)

Согласен. Зато функционал какой !!!
Цитата

это предпологается делать средствами STL, которые пора-бы уже и знать

Да влом постояно алгоритмы тягать, писанины много!


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Mayk
Дата 15.6.2008, 11:54 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


^аВаТаР^ сообщение>>
****


Профиль
Группа: Участник
Сообщений: 2616
Регистрация: 22.5.2005
Где: за границей разум а

Репутация: 45
Всего: 134




Цитата(Lazin @  15.6.2008,  15:43 Найти цитируемый пост)
ASCII 

user posted imageuser posted imageuser posted image
Цитата(Lazin @  15.6.2008,  15:43 Найти цитируемый пост)

алгоритмы + boost и QString нервно курит в сторонке,

 smile 


--------------------
 Здесь был кролик. Но его убили.
Человеки < кроликов, йа считаю.
PM MAIL WWW ICQ   Вверх
georain
Дата 15.6.2008, 15:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Бывалый
*


Профиль
Группа: Участник
Сообщений: 193
Регистрация: 28.11.2006
Где: Санкт-Петербург

Репутация: нет
Всего: нет



andrew_121, может сделать класс производный от std::string и добавить методы использующие алгоритмы?
PM MAIL   Вверх
andrew_121
Дата 15.6.2008, 16:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



Цитата(georain @ 15.6.2008,  15:16)
andrew_121, может сделать класс производный от std::string и добавить методы использующие алгоритмы?

Да, походу так и придется делать.


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
Lazin
Дата 15.6.2008, 16:35 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 3820
Регистрация: 11.12.2006
Где: paranoid oil empi re

Репутация: 41
Всего: 154



ASCII иногда приходится использовать для поддержки старых интерфейсов, я сейчас работаю над проектом, в котором используется ascii, так как объемы обробатываемого текста оч. большие, а все программы, которые со мной взаимодействуют юникод не понимают и им все-равно приходится отдавать в cp_1251 smile 

Цитата(Mayk @  15.6.2008,  11:54 Найти цитируемый пост)
 smile 

стандартные алгоритмы работают с string - find replace for_each... etc
всякие split join trim итд есть в boost

QString не каждый может себе позволить использовать.. так-что лучше использовать то-что стандартно smile 
PM MAIL Skype GTalk   Вверх
bsa
Дата 15.6.2008, 19:31 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Модератор
Сообщений: 9185
Регистрация: 6.4.2006
Где: Москва, Россия

Репутация: 63
Всего: 196



Цитата(georain @ 15.6.2008,  15:16)
andrew_121, может сделать класс производный от std::string и добавить методы использующие алгоритмы?

Зачем? Чем сторонняя функция хуже метода?
И вообще, есть правило, если имеющегося публичного интерфейса класса достаточно для реализации задачи с помощью внешней функции, то именно так и надо делать.
Класс стринг (да, да, именно std::string) вообще считается перегруженным. Большинство встроенных методов там просто не нужны. Чего только стоит наличие двух интерфейсов - под итераторы и под индексы.
PM   Вверх
andrew_121
Дата 15.6.2008, 19:57 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Кодофей
****


Профиль
Группа: Завсегдатай
Сообщений: 3448
Регистрация: 3.1.2008

Репутация: 6
Всего: 33



bsa - Как-то влом ипользовать алгоритмы. Проще(мне так кажется), все необходимое впихнуть в класс.
Цитата

Класс стринг (да, да, именно std::string) вообще считается перегруженным.

Так от какого наследовать чтоб разные компилеры не ругались?
Ну придется, сей хедер с проектом тягать, ну и ладно.
Нашел я в инете пару классов замещающих "std::string", ток они староваты, и MSVC-2008 и MinGW32, жутко ругаются на них.
Вот, гляжу, пытаюсь понять.
Кстати, вот они. "basic_string" - вроди замена стантартной.

Это сообщение отредактировал(а) andrew_121 - 15.6.2008, 20:11

Присоединённый файл ( Кол-во скачиваний: 10 )
Присоединённый файл  basic_string.rar 80,89 Kb


--------------------
Удалил аккаунт. Прощайте!
PM MAIL   Вверх
jonie
Дата 15.6.2008, 20:02 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
****


Профиль
Группа: Завсегдатай
Сообщений: 5613
Регистрация: 21.8.2005
Где: Владимир

Репутация: 15
Всего: 118



andrew_121 ну так запихай... наследование никто не отменял.
наследуйся от того что определишь в рантайме)
нечто вроде class WMyString::public wstring{};

как вариант примени агрегирование и вынеси то что тебе надо "наружу"


вы учитете, что используя нечто "стороннее" есть шанс искать чужие баги..

Это сообщение отредактировал(а) jonie - 15.6.2008, 20:03


--------------------
Что-то не поняли? -> Напейтесь до зеленых человечков... эта сверхцивилизация Вам поможет...
PM MAIL Jabber   Вверх
Ответ в темуСоздание новой темы Создание опроса
Правила форума "С++:Общие вопросы"
Earnest Daevaorn

Добро пожаловать!

  • Черновик стандарта C++ (за октябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика(4.4мб).
  • Черновик стандарта C (за сентябрь 2005) можно скачать с этого сайта. Прямая ссылка на файл черновика (3.4мб).
  • Прежде чем задать вопрос, прочтите это и/или это!
  • Здесь хранится весь мировой запас ссылок на документы, связанные с C++ :)
  • Не брезгуйте пользоваться тегами [code=cpp][/code].
  • Пожалуйста, не просите написать за вас программы в этом разделе - для этого существует "Центр Помощи".
  • C++ FAQ

Если Вам понравилась атмосфера форума, заходите к нам чаще! С уважением, Earnest Daevaorn

 
0 Пользователей читают эту тему (0 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | C/C++: Общие вопросы | Следующая тема »


 




[ Время генерации скрипта: 0.0674 ]   [ Использовано запросов: 22 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.