View Single Post
Old 02-09-2005, 06:58 PM   #5 (permalink)
Valmont
[code][/code] enforcer
 
Valmont's Avatar
 
Join Date: Mar 2003
Location: Netherlands
Posts: 1,544
Valmont is on a distinguished road
The original code is this:
Code:
#include <iostream>
#include <cstring>
#include "DelimitedString.h"
     
DelimitedString::DelimitedString() {
   this->delimiter = ",";
   this->count = 0;
}

DelimitedString::DelimitedString(string delimited) {
   this->input = delimited;
}

DelimitedString::DelimitedString(string delimited, string delimiter) {
   this->input =  delimited;
   this->delimiter = delimiter;
      
   parse();
}

DelimitedString::~DelimitedString() {
   elements.~vector<string>();
}

string DelimitedString::getText() {
   return input;
}

void DelimitedString::setDelimiter(string delimiter) {
   this->delimiter = delimiter;
   parse();
}

void DelimitedString::setDelimitedString(string input) {
   this->input = input;
   parse();
}

int DelimitedString::getCount() {
   count = elements.size();
   return count;
}

string DelimitedString::getElement(int index) {
   return elements.at(index);
}

void DelimitedString::parse() { 
   string* token = new string("");     
   elements.clear();   
   input = trim(input);

   int index;
   string newInput(input + delimiter);
   index = (int)newInput.find(delimiter); 
   
   for(;index != -1; index = (int)newInput.find(delimiter)) {
        try { 
          token = new string(trim(newInput.substr(0, index)));                    
          elements.push_back(*token);            
          //elements.push_back(trim(newInput.substr(0, index))); not working
        }
        catch (const exception& error) {
          cerr << "Error in DelimitedString::Parse : " << error.what() << endl;
        }
       
        try {
           newInput = newInput.substr(index + 1) + "";           
        }
        catch (const exception& error) {
          cerr << "Error in DelimitedString::Parse : " << error.what() << endl;
        }           
   }
}

string DelimitedString::trim(const string inputString) {
   string result("");   
   if (inputString != "") {
      int index;
      result = inputString;
      index = (int) result.find_last_not_of(' ');
      if (index != -1)
        result = result.substr(0, index + 1);
      index = (int) result.find_first_not_of(' ');
      if (index != -1)
        result = result.substr(index);         
   }
   return result;
}
You don't need a pointer to std::string.
So change it from
[ocde]
string* token = new string("");
[/code]
to
Code:
string token("");
Then you also have to change this:
Code:
token = new string(trim(newInput.substr(0, index)));                    
elements.push_back(*token);
to:
Code:
token =  trim(newInput.substr(0, index));
elements.push_back(token);
But basically you could optimize the whole thing:

The header
Code:
#ifndef __DELIMITEDSTRING_H__
#define __DELIMITEDSTRING_H__

#include <vector>
#include <string>

using namespace std;

class DelimitedString
{
   public:
     DelimitedString();
     DelimitedString(string delimited);
     DelimitedString(string delimited, string delimiter);
     ~DelimitedString();
     
     void parse();
     
     string getText() const;
     void setDelimitedString(string input);
     void setDelimiter(string delimiter);
          
     int getCount() const;
     string getElement(int index) const;
   private:
     string sInput_;
     int nCount_;
     string sDelimiter_;
     vector<string> Elements_;
     void trim(string& inputString);
};

#endif
Code:
#include "DelimitedString.h"
     
DelimitedString::DelimitedString() : sDelimiter_(","), nCount_(0)
{ }

DelimitedString::DelimitedString(string delimited) : sInput_(delimited)
{ }

DelimitedString::DelimitedString(string delimited, string delimiter) :
  sInput_(delimited), sDelimiter_(delimiter)
{ }

DelimitedString::~DelimitedString()
{ }

//--------------------------------------------------------

string DelimitedString::getText() const
{
  return sInput_;
}

void DelimitedString::setDelimiter(string delimiter)
{
  sDelimiter_ = delimiter;
}

void DelimitedString::setDelimitedString(string input)
{
  sInput_ = input;
}

int DelimitedString::getCount() const
{
  return Elements_.size();
}

string DelimitedString::getElement(int index) const
{
  if(Elements_.size() > 0)
  {
    return Elements_.at(index);
  }
  else
  {
    throw "Could not split";
  }
}

void DelimitedString::parse()
{
  //Remove spaces first.
  trim(sInput_);
  string::size_type first;
  for(string::size_type index=0 ; index < sInput_.size(); )
  {
    first = sInput_.find_first_not_of(sDelimiter_, index);
    index = sInput_.find_first_of(sDelimiter_, first);
    if(first != string::npos)
    {
      Elements_.push_back(sInput_.substr(first, index-first));
    }
  }
}


void DelimitedString::trim( string& inputString)
{
  
  for(unsigned i = 0; i < inputString.size(); ++i)
  {
    if(inputString[i] == ' ')
    {
      inputString.erase(i, 1);
    }
  }
}
But now in main, you have to call parse explicitly:
Code:
#include <iostream>
#include "DelimitedString.h" using namespace std;

int main(int argc, char *argv[])
{
  DelimitedString ds;
  ds.setDelimitedString(" hrmh ,wisnu,widiarta ");
  ds.setDelimiter(",");

  ds.parse();

  cout<<ds.getCount()<<endl;
  cout<<ds.getElement(0)<<endl;
  cout<<ds.getElement(1)<<endl;
  cout<<ds.getElement(2)<<endl;
  
  system("PAUSE");  
  return 0;
}
__________________
Valmont is offline   Reply With Quote