Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > C/C++: Общие вопросы > Нужна замена для std::string


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

Автор: anatox91 15.6.2008, 09:23
ну наваляй что-то типа такого:
Код

#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] не работает или это у меня только такие глюки?

Автор: bronislav 15.6.2008, 09:26
А чем тебя не устраивает std::string?


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

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

Автор: yar 15.6.2008, 10:23
std::string можно использовать с http://www.boost.org/doc/libs/1_35_0/doc/html/string_algo.html.. 
Там много дополнительного функционала, не включённого в STL.

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

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

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

QString это BLOB(антипаттерн)
алгоритмы + boost и QString нервно курит в сторонке, string конечно то-же огромен, но там практичесски нет функционала для обработки строк, это предпологается делать средствами STL, которые пора-бы уже и знать smile  
к тому-же QString только Unicode, иногда нужен ASCII

Автор: andrew_121 15.6.2008, 11:49
Lazin
Цитата

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

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

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

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

Автор: Mayk 15.6.2008, 11:54

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

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

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

 smile 

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

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

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

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

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

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

QString не каждый может себе позволить использовать.. так-что лучше использовать то-что стандартно smile 

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

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

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

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

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

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

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


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

Автор: Lazin 15.6.2008, 20:46
почему алгоритм это плохо..? в классе string и так около сотни методов, вам мало? smile 

Автор: Alek86 16.6.2008, 12:06
Цитата(andrew_121 @  15.6.2008,  19:57 Найти цитируемый пост)
Проще(мне так кажется), все необходимое впихнуть в класс.

отакие вот создали MFC... smile

и, как я понял, в сторону Boost String Algorithms Library ты даже не посмотрел
тогда уж пользуй QString

Автор: andrew_121 16.6.2008, 12:27
Lazin - гм... Я их там не больше 10-ти насчитал.

Добавлено через 2 минуты и 8 секунд
Alek86 - Именно в сторону Boost String Algorithms я и смотрю.
Но вот незадача, мне нужен класс в одном-двух хедерах, а вот Boost тягать с собой совсем неохота!

Автор: Lazin 16.6.2008, 12:38
andrew_121, конструкторы, операторы и все варианты их перегрузки smile 

Автор: Alek86 16.6.2008, 12:40
Цитата(andrew_121 @  16.6.2008,  12:27 Найти цитируемый пост)
мне нужен класс в одном-двух хедерах

зря
таких монстров в 1 хедере хранить - плохая затея

Цитата(andrew_121 @  16.6.2008,  12:27 Найти цитируемый пост)
вот Boost тягать с собой совсем неохота!

у буста есть утилитка, с помощью котрой можно "вытаскивать" из него определенные библиотеки с их зависимостями

Цитата(andrew_121 @  16.6.2008,  12:27 Найти цитируемый пост)
гм... Я их там не больше 10-ти насчитал.

плохо считал, что тут скажешь
только в стандарте их "туева хуча", а в реализациях и поболя

Автор: andrew_121 16.6.2008, 14:43
Alek86 - Я их насчитал 35.
Но не в этом дело. Все равно, функционал некакущий !!!

Автор: Mayk 16.6.2008, 14:59
35? буга.
Чисто для справки перечень ф-ций из драфта.  И это только члены класса std::string'а. Про операторы молчу

21.3 @ c++-draft-nov2006-n2135.txt

Код

           explicit basic_string(const Allocator& a = Allocator());
           basic_string(const basic_string& str );
           basic_string(const basic_string& str , size_type pos , size_type n = npos, const Allocator& a = Allocator());
           basic_string(const charT* s , size_type n , const Allocator& a = Allocator());
           basic_string(const charT* s , const Allocator& a = Allocator());
           basic_string(size_type n , charT c , const Allocator& a = Allocator());
           template<class InputIterator> basic_string(InputIterator begin , InputIterator end ,  const Allocator& a = Allocator());
          ~basic_string();
           basic_string& operator=(const basic_string& str );
           basic_string& operator=(const charT* s );
           basic_string& operator=(charT c );
           iterator               begin();
           const_iterator         begin() const;
           iterator               end();
           const_iterator         end() const;
     reverse_iterator         rbegin();
     const_reverse_iterator   rbegin() const;
     reverse_iterator         rend();
     const_reverse_iterator   rend() const;
     const_iterator           cbegin() const;
     const_iterator           cend() const;
     const_reverse_iterator   crbegin() const;
     const_reverse_iterator   crend() const;
     size_type size() const;
     size_type length() const;
     size_type max_size() const;
     void resize(size_type n , charT c );
     void resize(size_type n );
     size_type capacity() const;
     void reserve(size_type res_arg = 0);
     void clear();
     bool empty() const;
     const_reference operator[](size_type pos ) const;
     reference            operator[](size_type pos );
     const_reference at(size_type n) const;
     reference            at(size_type n);
     basic_string& operator+=(const basic_string& str );
     basic_string& operator+=(const charT* s );
     basic_string& operator+=(charT c );
     basic_string& append(const basic_string& str );
     basic_string& append(const basic_string& str , size_type pos ,                           size_type n );
     basic_string& append(const charT* s , size_type n );
     basic_string& append(const charT* s );
     basic_string& append(size_type n , charT c );
     template<class InputIterator>        basic_string& append(InputIterator first , InputIterator last );
     void push_back(charT c );
     basic_string& assign(const basic_string& str );
     basic_string& assign(const basic_string& str , size_type pos ,                          size_type n );
     basic_string& assign(const charT* s , size_type n );
     basic_string& assign(const charT* s );
     basic_string& assign(size_type n , charT c );
     template<class InputIterator>      basic_string& assign(InputIterator first , InputIterator last );
      basic_string& insert(size_type pos1 , const basic_string& str );
      basic_string& insert(size_type pos1 , const basic_string& str ,                           size_type pos2 , size_type n );
      basic_string& insert(size_type pos , const charT* s , size_type n );
      basic_string& insert(size_type pos , const charT* s );
      basic_string& insert(size_type pos , size_type n , charT c );
      iterator insert(iterator p , charT c );
      void     insert(iterator p , size_type n , charT c );
      template<class InputIterator>        void insert(iterator p , InputIterator first , InputIterator last );
      basic_string& erase(size_type pos = 0, size_type n = npos);
      iterator erase(iterator position );
      iterator erase(iterator first , iterator last );
      basic_string& replace(size_type pos1 , size_type n1 ,                            const basic_string& str );
      basic_string& replace(size_type pos1 , size_type n1 ,                            const basic_string& str ,                            size_type pos2 , size_type n2 );
      basic_string& replace(size_type pos , size_type n1 , const charT* s ,                            size_type n2 );
      basic_string& replace(size_type pos , size_type n1 , const charT* s );
      basic_string& replace(size_type pos , size_type n1 , size_type n2,                            charT c );
      basic_string& replace(iterator i1 , iterator i2 ,                            const basic_string& str );
      basic_string& replace(iterator i1 , iterator i2 , const charT* s ,                            size_type n );
      basic_string& replace(iterator i1 , iterator i2 , const charT* s );
      basic_string& replace(iterator i1 , iterator i2 ,                            size_type n , charT c );
      template<class InputIterator>        basic_string& replace(iterator i1 , iterator i2 ,                              InputIterator j1 , InputIterator j2 );
      size_type copy(charT* s , size_type n , size_type pos = 0) const;
      void swap(basic_string& str );
      const charT* c_str() const;
      const charT* data() const;
      allocator_type get_allocator() const;
      size_type   find   (const   basic_string& str , size_type pos = 0) const;
      size_type   find   (const   charT* s , size_type pos , size_type n ) const;
      size_type   find   (const   charT* s , size_type pos = 0) const;
      size_type   find   (charT   c , size_type pos = 0) const;
      size_type   rfind(const   basic_string& str , size_type pos = npos) const;
      size_type   rfind(const   charT* s , size_type pos , size_type n ) const;
      size_type   rfind(const   charT* s , size_type pos = npos) const;
      size_type   rfind(charT   c , size_type pos = npos) const;
      size_type find_first_of(const basic_string& str ,                              size_type pos = 0) const;
      size_type find_first_of(const charT* s ,                              size_type pos , size_type n ) const;
      size_type find_first_of(const charT* s , size_type pos = 0) const;
      size_type find_first_of(charT c , size_type pos = 0) const;
      size_type find_last_of (const basic_string& str ,                              size_type pos = npos) const;
      size_type find_last_of (const charT* s ,                              size_type pos , size_type n ) const;
      size_type find_last_of (const charT* s , size_type pos = npos) const;
      size_type find_last_of (charT c , size_type pos = npos) const;
      size_type find_first_not_of(const basic_string& str ,                                  size_type pos = 0) const;
      size_type find_first_not_of(const charT* s , size_type pos ,                                  size_type n ) const;
      size_type find_first_not_of(const charT* s , size_type pos = 0) const;
      size_type find_first_not_of(charT c , size_type pos = 0) const;
      size_type find_last_not_of (const basic_string& str ,                                  size_type pos = npos) const;
      size_type find_last_not_of (const charT* s , size_type pos ,                                  size_type n ) const;
      size_type find_last_not_of (const charT* s ,                                  size_type pos = npos) const;
      size_type find_last_not_of (charT c , size_type pos = npos) const;
       basic_string substr(size_type pos = 0, size_type n = npos) const;
       int compare(const basic_string& str ) const;
       int compare(size_type pos1 , size_type n1 ,                   const basic_string& str ) const;
       int compare(size_type pos1 , size_type n1 ,                   const basic_string& str ,                   size_type pos2 , size_type n2 ) const;
       int compare(const charT* s) const;
       int compare(size_type pos1 , size_type n1 ,                   const charT* s ) const;
       int compare(size_type pos1 , size_type n1 ,                   const charT* s , size_type n2 ) const;


Цитата(Lazin @  16.6.2008,  00:46 Найти цитируемый пост)
в классе string и так около сотни методов, вам мало? 

причем около сотни следует читать лишь как "больше сотни".  smile  smile  smile 

Автор: Lazin 16.6.2008, 15:14
Цитата(andrew_121 @  16.6.2008,  14:43 Найти цитируемый пост)
Но не в этом дело. Все равно, функционал некакущий !!!

а какой нужен функционал?

Автор: andrew_121 16.6.2008, 15:22
Mayk - Я имел ввиду, поименно. Ну а если посчитать ВСЕ, то ДА, огого...
Повторюсь: Все равно, функционал некакущий !!!
Не регулярных выражений, ни сдвигов...т.е. МАЛОВАТО !!!
Блин, ну поймите - проект, с приогромнейшим кол-вом строковых операций.

Автор: Lazin 16.6.2008, 16:37
Цитата(andrew_121 @  16.6.2008,  15:22 Найти цитируемый пост)
Не регулярных выражений

ты уж меня извини, но гда ты видел рег. выражения в строковом классе. а если я их в программе не использую? В общем почитай про антипатерн blob.
Пс
есть boost::regex
есть boost::xpression, что то подобное есть в QString? Или в каком нибудь другом строковом классе...

Цитата(andrew_121 @  16.6.2008,  15:22 Найти цитируемый пост)
сдвигов

вставить нужное количество пробелов не судьба?

Цитата(andrew_121 @  16.6.2008,  12:27 Найти цитируемый пост)
Но вот незадача, мне нужен класс в одном-двух хедерах, а вот Boost тягать с собой совсем неохота! 

ну, QString вообще-то не бывает без Qt.. проблема-то в чем? Штука в том, что string и алгоритмы - header only, что очень сильно тебе упрощает задачу, а ты сопротивляешься этому smile

Автор: andrew_121 16.6.2008, 17:01
Понял. Нужно писать свой класс. Унаследоваться от std::string, впихнуть в него все что нужно.
Alek86
Цитата(Alek86 @  16.6.2008,  12:40 Найти цитируемый пост)
у буста есть утилитка, с помощью котрой можно "вытаскивать" из него определенные библиотеки с их зависимостями

А чё за зверь? Как звать? И много за собой тянет?

Думал тему закрыть, но нет, Буду сюда писать вопросы по реализации сего класса.

Автор: bsa 16.6.2008, 17:07
Цитата(andrew_121 @ 16.6.2008,  17:01)
Понял. Нужно писать свой класс. Унаследоваться от std::string, впихнуть в него все что нужно.

smile
Ты ничего не понял. Ну ничего, скоро поймешь.
Кстати, было на баше как-то про админов: админы делятся на два типа: тех, которые уже делают бекапы, и тех, которые еще не делают. Выводы сделай сам.

Автор: JackYF 16.6.2008, 17:25
Цитата(andrew_121 @  16.6.2008,  16:01 Найти цитируемый пост)
Буду сюда писать вопросы по реализации сего класса.

За тебя уже всё реализовано, что ты собираешься реализовывать?

Автор: andrew_121 16.6.2008, 17:32
bsa, JackYF - Вам смешно. А мне совсем не до смеха. При виде кусков кода по разбору, и парсингу std::string !!!

Автор: bsa 16.6.2008, 17:37
andrew_121, зачем стринг разбирать и более того, парсить? Нужно выделить какой-то элемент - напиши функцию, которая это делает. И будет все понятно. Как ты ее напишешь - сугубо на твоей совести, главное, чтобы в основном теле программы прослеживался алгоритм, и не было лишних отвлечений на всякие ненужные в данном месте детали.

Автор: Lazin 16.6.2008, 18:47
Цитата(andrew_121 @  16.6.2008,  17:01 Найти цитируемый пост)
Понял. Нужно писать свой класс. Унаследоваться от std::string, впихнуть в него все что нужно.

все, я сюда больше не пишу smile 
распинался, распинался и бестолку, на всякий случай - http://en.wikipedia.org/wiki/God_object к размышлению smile 
блин, да-же в .NET строки не умеют столько, сколько ты хочешь smile  

Автор: andrew_121 16.6.2008, 19:24
Цитата(bsa @  16.6.2008,  17:37 Найти цитируемый пост)
Как ты ее напишешь - сугубо на твоей совести

Замечательно сказано  smile 
Цитата(bsa @  16.6.2008,  17:37 Найти цитируемый пост)
зачем стринг разбирать и более того, парсить?

Пограмма - html, php - парсер. Типа препроцессора у нас, у программеров. В программе 14248 строк. Писана не мной. Есть шесть глюков.
Когда я начал пялиться в код....это было что-то... smile  smile 
Код, до того безобразно написан, что я, каждый файл, форматирую(вручную), и походу выискиваю бяки.

У меня внатуре дилемма !!!

Автор: bronislav 16.6.2008, 19:49
Цитата(andrew_121 @  16.6.2008,  18:24 Найти цитируемый пост)
В программе 14248 строк.

Ну в принципе не так уж и много

Я как-то программу на Delphi на 16к строк перевел на C++ за 3 недели smile
Правда впетчатления те еще smile 

Автор: andrew_121 16.6.2008, 19:53
Цитата(bronislav @  16.6.2008,  19:49 Найти цитируемый пост)
Я как-то программу на Delphi на 16к строк перевел на C++ за 3 недели

Следовало внести в книгу рекордов(настойчивости).

Автор: bronislav 16.6.2008, 19:56
Цитата(andrew_121 @  16.6.2008,  18:24 Найти цитируемый пост)
каждый файл, форматирую(вручную),


Вообще-то для таких вещей есть рефакторинг.
Тот же еклипс умеет автоматически переформатировать код в соостветствии с выбранным стилем

Автор: andrew_121 16.6.2008, 20:04
Цитата(bronislav @ 16.6.2008,  19:56)
Цитата(andrew_121 @  16.6.2008,  18:24 Найти цитируемый пост)
каждый файл, форматирую(вручную),


Вообще-то для таких вещей есть рефакторинг.
Тот же еклипс умеет автоматически переформатировать код в соостветствии с выбранным стилем

Так я в ручную, для того-что бы понять, и вкурить сею рукопись.(ух как заговорил)

Автор: bsa 16.6.2008, 20:25
мы отошли от темы.
я уже упоминал правило, если какую-то задачу можно решить отдельной функцией с использованием открытого интерфейса класса, то так и надо делать. Более того, даже оператор сложения надо определять внешней функцией (так как есть конструктор копирования и метод конкатенции).

Кстати запись text.extractValue("name", &var); по длине равна: extractValue(text, "Name", &var); Зато вторая не перегружает интерфейс класса лишним.
Что тебе еще надо? toInt, toDouble? Ну если тебе кажется boost::lexical_cast слижком громоздким, то напиши для него соответствующие враперы: 
Код
namespace {
template<class T>
inline double toDouble(const T &v)
{
    return boost::lexical_cast<double>(v);
}

template<class T>
inline int toInt(const T &v)
{
    return boost::lexical_cast<int>(v);
}
//и так далее...
} //namespace
В итоге запись будет выглядеть так: double t = toDouble(text); Обрати внимание, что в данном случае запись получилась даже короче, чем если бы toDouble() был реализован в виде метода (нет точки). Более того, даже если у тебя text содержал что-то непереводимое в double, то будет кинуто исключение.

Автор: andrew_121 16.6.2008, 20:38
bsa - Спасибо.
Решено - boost respect !
Alek86 
Цитата

у буста есть утилитка, с помощью котрой можно "вытаскивать" из него определенные библиотеки с их зависимостями

Кто нибудь знает что это за тулза такая?

Автор: Lazin 16.6.2008, 20:51
Цитата(andrew_121 @  16.6.2008,  20:38 Найти цитируемый пост)
у буста есть утилитка, с помощью котрой можно "вытаскивать" из него определенные библиотеки с их зависимостями

которую лучше не использовать.. если не хотите гемороя с обновлением этой библиотеки smile 

Автор: bsa 16.6.2008, 20:54
andrew_121, зачем тебе эта утилита?
Пишешь в документации к проекту, что для его сборки нужен boost, версии не ниже такой-то. И все. Остальное на совести тех, кто будет собирать.

Автор: andrew_121 16.6.2008, 20:58
Всем приогромнейшее Спасибо.
Тема закрыта.

Автор: Alek86 17.6.2008, 10:12
опоздал, но все же
Цитата(andrew_121 @  16.6.2008,  17:01 Найти цитируемый пост)
А чё за зверь? Как звать? И много за собой тянет?

http://www.boost.org/doc/libs/1_35_0/tools/bcp/bcp.html


Цитата(Lazin @  16.6.2008,  20:51 Найти цитируемый пост)
которую лучше не использовать.. если не хотите гемороя с обновлением этой библиотеки

нуну
и часто ты буст обновляешь?

Автор: Lazin 17.6.2008, 10:33
Цитата(Alek86 @  17.6.2008,  10:12 Найти цитируемый пост)
нуну
и часто ты буст обновляешь? 

когда выходят новые версии, а теперь представь, что мне еще что-нибудь захотелось из буста использовать, мне еще вырезать кусочек))

Цитата(http://www.boost.org/doc/libs/1_35_0/tools/bcp/bcp.html)

The bcp utility is a tool for extracting subsets of Boost, it's useful for Boost authors who want to distribute their library separately from Boost, and for Boost users who want to distribute a subset of Boost with their application.

в общем это очень не для всех... smile 

Автор: Alek86 17.6.2008, 10:45
Цитата(Lazin @  17.6.2008,  10:33 Найти цитируемый пост)
for Boost users who want to distribute a subset of Boost with their application.

я про это и говорил - человек не хочет весь буст с собой таскать

Цитата(Lazin @  17.6.2008,  10:33 Найти цитируемый пост)
когда выходят новые версии

а зачем его обновлять, если, допустим, операции для строк не поменялись?
или поменялись, но тебе те изменения побоку
твое же и так работает

Цитата(Lazin @  17.6.2008,  10:33 Найти цитируемый пост)
что мне еще что-нибудь захотелось из буста использовать,

ну ты прям щас как автор темы насчет класса строк говоришь smile
чтобы таксать с собой этакую God Library, в которой есть все
для того, чтобы "если что" не нужно было добавлять лишние файлы

Автор: Lazin 17.6.2008, 11:43
Цитата(Alek86 @  17.6.2008,  10:45 Найти цитируемый пост)
я про это и говорил - человек не хочет весь буст с собой таскать

архив трудно распаковать? smile 

странные вы люди, значит буст с собой таскать как библиотеку - зло, а отрезать от него кусок и сделать частью своего проекта - гут smile 



Цитата(Alek86 @  17.6.2008,  10:45 Найти цитируемый пост)
ну ты прям щас как автор темы насчет класса строк говоришь smile
чтобы таксать с собой этакую God Library, в которой есть все
для того, чтобы "если что" не нужно было добавлять лишние файлы 

знаешь, класс и набор библиотек - немного разные вещи))

Автор: vinter 17.6.2008, 13:27
Lazin, дело говорит, мало ли потом придется использовать некую вещь из буста, которая будет дергать функционал который ты выдрал, а этот функционал поменял немного свое поведение и теперь они не совместимы.. Вообщем не вижу никаких проблем в таскании буста за собой.

Автор: andrew_121 17.6.2008, 18:17
Цитата(Lazin @  17.6.2008,  11:43 Найти цитируемый пост)
значит буст с собой таскать как библиотеку - зло, а отрезать от него кусок и сделать частью своего проекта - гут

Обсолютно согласен. Осознал. Нет смысла.

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)