'C++'에 해당되는 글 4건

  1. 2014.01.07 std::pair와 std::sort에 대한 기본 사용법
  2. 2013.08.09 random_shuffle
  3. 2013.08.05 convert int to string c++
  4. 2013.08.05 [펌][C++] String Tokenizer



출처 : http://thunder0502.blogspot.jp/2013/09/stdpair-stdsort.html

std::pair와 std::sort에 대한 기본 사용법

  1.       
  2. #include <iostream>  
  3. #include <iomanip>  
  4. #include <string>  
  5. #include <vector>  
  6. #include <cmath>  
  7. #include <cstdlib>  
  8. #include <ctime>  
  9. #include <algorithm> // std::sort  
  10. #include <utility> // std::pair  
  11.   
  12. int main() {  
  13.  int ints1[] = {5, 4, 2, 1, 3};  
  14.  int ints2[] = {9, 7, 6, 8, 10};  
  15.   
  16.  std::vector<std::pair<intint> > myvector;  
  17.   
  18.  for(int i = 0; i < 5; i++)  
  19.   myvector.push_back(std::make_pair(ints2[i], ints1[i]));  
  20.   
  21.  // print pair object  
  22.  for(size_t i = 0; i < myvector.size(); i++)  
  23.   std::cout << myvector[i].first << ", " << myvector[i].second << '\n';  
  24.  std::cout << '\n';  
  25.   
  26.  // ordering pair object  
  27.  std::sort(myvector.begin(), myvector.end());  
  28.   
  29.  // print pair object after ordering pair object  
  30.  for(size_t i = 0; i < myvector.size(); i++)  
  31.   std::cout << myvector[i].first << ", " << myvector[i].second << '\n';  
  32.   
  33.  return 0;  
  34. }  


'C++' 카테고리의 다른 글

std::pair와 std::sort에 대한 기본 사용법  (0) 2014.01.07
random_shuffle  (0) 2013.08.09
convert int to string c++  (0) 2013.08.05
[펌][C++] String Tokenizer  (0) 2013.08.05
Posted by 그래제길
2013.08.09 14:44



출처 http://www.cplusplus.com/reference/algorithm/random_shuffle/



std::random_shuffle




Example

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
// random_shuffle example
#include <iostream>     // std::cout
#include <algorithm>    // std::random_shuffle
#include <vector>       // std::vector
#include <ctime>        // std::time
#include <cstdlib>      // std::rand, std::srand

// random generator function:
int myrandom (int i) { return std::rand()%i;}

int main () {
  std::srand ( unsigned ( std::time(0) ) );
  std::vector<int> myvector;

  // set some values:
  for (int i=1; i<10; ++i) myvector.push_back(i); // 1 2 3 4 5 6 7 8 9

  // using built-in random generator:
  std::random_shuffle ( myvector.begin(), myvector.end() );

  // using myrandom:
  std::random_shuffle ( myvector.begin(), myvector.end(), myrandom);

  // print out content:
  std::cout << "myvector contains:";
  for (std::vector<int>::iterator it=myvector.begin(); it!=myvector.end(); ++it)
    std::cout << ' ' << *it;

  std::cout << '\n';

  return 0;
}


Possible output:
myvector contains: 3 4 1 6 8 9 2 7 5




'C++' 카테고리의 다른 글

std::pair와 std::sort에 대한 기본 사용법  (0) 2014.01.07
random_shuffle  (0) 2013.08.09
convert int to string c++  (0) 2013.08.05
[펌][C++] String Tokenizer  (0) 2013.08.05
Posted by 그래제길
2013.08.05 14:26

This EE article provides examples of conversion techniques for various types of string variables:  classic C-style strings, MFC/ATL CStrings, and STL's std::string data type.

Convert Integer to String


int to C-style (NULL-terminated char[]) string

1:
2:
3:
4:
5:
6:
7:
8:
9:
10:
11:
12:
13:
int   n=1234567890;
char  szResult[12];

#include <stdio.h>
...
sprintf
(   szResult, "%d", n );               // use "%u" for unsigned int
sprintf_s
( szResult, sizeof(szResult), "%d", n );  // "safe" version

//------------------------------------- alternative: itoa
#include <stdlib.h>
...
_itoa
(   n, szResult, 10 );
_itoa_s
( n, szResult, sizeof(szResult), 10);    // "safe" version


int to ATL/MFC CString

1:
2:
3:
4:
5:
6:
#include <cstringt.h>
...
int     n;
CString sResult;

sResult
.Format( "%d", n );    // use "%u" for unsigned int


int to STL std::string

1:
2:
3:
4:
5:
6:
7:
8:
9:
#include <iostream>
#include <sstream>
...
int         n;
std
::string sResult;

std
::ostringstream ostr;
ostr
<< n;
sResult
= ostr.str();



Convert String to Integer


C-style (NULL-terminated char[]) string to int

1:
2:
3:
4:
5:
6:
#include <stdlib.h>
...
char szNumber[12]= "1234567890";
int  nResult;

nResult
= atoi( szNumber );


ATL/MFC CString to int

1:
2:
3:
4:
5:
6:
#include <cstringt.h>  
...
CString sNumber= "1234567890";
int     nResult;

nResult
= atoi( sNumber );  // automatically does LPCSTR(sNumber)


STL std::string to int

1:
2:
3:
4:
5:
6:
7:
#include <string>
#include <stdlib.h>
...
std
::string sNumber= "1234567890";
int         nResult;

nResult
= atoi( sNumber.c_str() );



Notes:

  • If you are using the UNICODE character set and supplying an output buffer (as with sprintf and itoa) you'll need to keep in mind that characters are two bytes long.  The normal procedure is to declare character buffers as the TCHAR data type, which will take into consideration the data element size.


  • Output buffer length.
    C++ integers are typically 32-bits, with values as high as billions; the range is:
    1:
    2:
    
                     0 to 4,294,967,295 (unsigned)
       
    -2,147,483,648 to 2,147,483,647 (signed)
    Thus, the maximum length of the resulting string is 12 characters (including NULL terminator and not including commas or other formatting). 

    If you are working with 64-bit integers (called __int64 or long long), the values are as high as quintillions; the range is:
    1:
    2:
    
                                 0 to 18,446,744,073,709,551,615 (unsigned)
       
    -9,223,372,036,854,775,808 to  9,223,372,036,854,775,807 (signed)
    Thus, the maximum length of the resulting string is 21 characters (including NULL terminator and not including commas or other formatting).


  • Both sprintf and itoa have been termed unsafe (some would say they've been deprecated, others would not use that term) because of the chance that a sloppy programmer might not provide a large enough output buffer.

    The examples show how to use the safer xxx_s variations of these functions as an alternative.  The older functions might write beyond the end of the buffer and stomp on other variables or blow the stack frame -- and cause endless debugging headaches.  Of course, if you are determined to give yourself grief, you can still blow up the "safe" version by passing in the wrong length value...  

    The CString::Format function allocates the buffer for you and takes care to avoid the buffer overrun problem.  The std::ostringstream << (insertion operator) also takes care of the buffer allocation for you.


  • The examples above compile and work under Microsoft VS2008.  Some Microsoft-specific functionality is implied (refer to the references, below, if you worry about these things).  However, there is an excellent chance that at least one of the variations will work for you in your development system, whatever it is.



References:

atoi, _atoi_l, _wtoi, _wtoi_l
http://msdn.microsoft.com/en-us/library/yd5xkb5c.aspx

sprintf, _sprintf_l, swprintf, _swprintf_l, __swprintf_l
http://msdn.microsoft.com/en-us/library/ybk95axf.aspx

_itoa, _i64toa, _ui64toa, _itow, _i64tow, _ui64tow
http://msdn.microsoft.com/en-us/library/yakksftt(VS.80).aspx

String to Numeric Value Functions  (strtoX, et al.)
http://msdn.microsoft.com/en-us/library/53b7b72e(VS.80).aspx

Data Conversion  (ultoX, etc.)
http://msdn.microsoft.com/en-us/library/0heszx3w(VS.80).aspx

CStringT::Format
http://msdn.microsoft.com/en-us/library/aa314327(VS.60).aspx

ostringstream
http://msdn.microsoft.com/en-us/library/6kacs5y3.aspx

=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=
If you liked this article and want to see more from this author,  please click the Yes button near the:
      Was this article helpful? 
label that is just below and to the right of this text.   Thanks!
=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-=-= 


출처 : 
 http://blog.naver.com/wassupnari?Redirect=Log&logNo=100107651361  

'C++' 카테고리의 다른 글

std::pair와 std::sort에 대한 기본 사용법  (0) 2014.01.07
random_shuffle  (0) 2013.08.09
convert int to string c++  (0) 2013.08.05
[펌][C++] String Tokenizer  (0) 2013.08.05
Posted by 그래제길
2013.08.05 12:29


프로그래밍을 하다보면 string을 여러개의 작은 string으로 나눠야 할 때가 있다.
자바를 사용하는 개발자는 StringTokenizer클래스를 아주 유용히 썼을 것이며
C개발자는 strtok()라는 함수를 사용하였을 것이다.
애석하게도 C++에서는 동일한 기능의 클래스나 함수를 제공해 주지 않고 있다.
C의 strtok를 호출해도 되겠지만 관련 클래스를 하나 만드는 것도 나쁘진 않다.

string을 token으로 구분하는 방법은 여러가지가 있을 수 있는데 여기서 몇가지 방법을 소개하면,

1. stringstream을 이용한 stringTokenizer

먼저 공백(whitespace)을 기준으로 string을 나눈다면 stringstream 클래스를 사용하면 된다.
C++에서 사용되는 stream클래스들은 그 특성상 공백을 기준으로 데이터를 읽어들인다. 
따라서 아래 코드 처럼 stringstream 객체를 사용하면 string을 나눠서 읽어 드릴 수 있다.

#include "string"
#include "sstream"
#include "iostream"

using namespace std;

int main()
{
    string str("This is a string to be split");
    string token; 

    stringstream stream(str); 

    while (stream >> token)
        cout << token<< endl;
}

결과값


This
is
a
string
to
be
split



2. 클래스를 정의하는 방법

함수에 클래스 껍데기를 입히는 형태로 만들면 된다. 객체가 필요없으므로 static으로 선언하는 게 
좋다. getTokens()의 두번째 인자로 구분자들을 넣어주면 된다. 

// 주의. 아래 [ ]는 이 에디터가 태그로 인식해 버려서 바꿔 놓은 겁니다. >원래의 것으로 바꿔 테스트해야 합니다.


#include "string"
#include "algorithm"  // copy
#include "vector"
#include "iostream"
#include "iterator"     // ostream_iterator

using namespace std;

class StringTokenizer
{
public:
  static vector[string] getTokens(const string& str, const string& delimiters = " ")
  {
    string::size_type lastPos = str.find_first_not_of(delimiters, 0); // 맨 처음 문자가 구분자일 때
    string::size_type pos     = str.find_first_of(delimiters, lastPos);     // 구분자 찾기
    vector[string] tokens;
    while (string::npos != pos || string::npos != lastPos)
    {
        tokens.push_back(str.substr(lastPos, pos - lastPos)); // 찾은 token을 vector에 저장
        lastPos = str.find_first_not_of(delimiters, pos);        // 구분자 다음으로 이동
        pos = str.find_first_of(delimiters, lastPos);        // 다음구분자 찾기
    }
    return tokens;
  }
};
int main()
{
    string str("This is a string to be split.");
    vector[string] tokens = StringTokenizer::getTokens(str);   // default구분자 사용. 여기서는 " "
    copy(tokens.begin(), tokens.end(), ostream_iterator[string](cout, "\n"));  // tokens을 cout시킴
    return 0;
}

결과값

This
is
a
string
to
be
split



자바의 StringTokenizer와 동일하게 여러가지 함수를 추가해서 만들 수도 있겠지만 단순 
stringtokenizer로는 쓸 만 하다.

  

3. 좀 더 다양한 함수를 가진 StringTokenizer

----------- StringTokenizer.h ---------------

 #ifndef STRINGTOKENIZER_H
#define STRINGTOKENIZER_H

#include "iostream"
#include "string"
using namespace std;

class StringTokenizer
{
   public:
    StringTokenizer(const string& pStr, const string& pDelimeter);
    int         countTokens();
    bool        hasMoreTokens();
    string nextToken();
    string nextToken(const string& pDelimeter);

   private:
    string  iStr;
    string  iDelimeter;
};
#endif


//---------- StringTokenizer.cpp ---------------

/**
 * 생성자
 */
StringTokenizer::StringTokenizer(const string& pStr, const string& pDelimeter)
{
   if ((pStr.length() == 0) || (pDelimeter.length() == 0)) return;
   iStr = pStr;
   iDelimeter     = pDelimeter;
  // 연속 구분자 제거
   unsigned int tPosition = 0;
   while(true)
   {
      if ((tPosition = iStr.find(iDelimeter,tPosition)) != string::npos)
      {
         tPosition += iDelimeter.length();
         while(iStr.find(iDelimeter,tPosition) == tPosition)
         {
            iStr.erase(tPosition,iDelimeter.length());
         }
      }
      else
       break;
   }
   // 맨앞에 나오는 구분자 제거
   if (iStr.find(iDelimeter,0) == 0)
   {
      iStr.erase(0,iDelimeter.length());
   }
   // 맨뒤에 나오는 구분자 제거
   tPosition = 0;
   if ((tPosition = iStr.rfind(iDelimeter)) != string::npos)
   {
      if (tPosition != (iStr.length() - iDelimeter.length())) return;
      iStr.erase(iStr.length() - iDelimeter.length(),iDelimeter.length());
   }
}

/**
 * 총 token 갯수
 */
int StringTokenizer::countTokens()
{
   unsigned int tPrevPosition = 0;
   int tNoOfTokens        = 0;
   if (iStr.length() > 0)
   {
      tNoOfTokens = 0;
      unsigned int tPosition = 0;
      while(true)
      {
         if ((tPosition = iStr.find(iDelimeter,tPosition)) != string::npos)
         {
            tNoOfTokens++;
            tPrevPosition  = tPosition;
            tPosition += iDelimeter.length();
         }
         else
          break;
      }
      return ++tNoOfTokens;
   }
   else
   {
      return 0;
   }
}

/**
 * 다음 token 존재 여부 리턴
 */
bool StringTokenizer::hasMoreTokens()
{
   return (iStr.length() > 0);
}

/**
 * 다음 token 리턴
 */
string StringTokenizer::nextToken()
{
   if (iStr.length() == 0)
     return "";
   string  tReturnStr = "";
   unsigned int tPosition     = iStr.find(iDelimeter,0);
   if (tPosition != string::npos)
   {
      tReturnStr   = iStr.substr(0,tPosition);
      iStr = iStr.substr(tPosition+iDelimeter.length(),iStr.length()-tPosition);
   }
   else
   {
      tReturnStr   = iStr.substr(0,iStr.length());
      iStr = "";
   }
   return tReturnStr;
}

/**
 * 다음 token 리턴
 */
string StringTokenizer::nextToken(const string& iDelimeteriter)
{
   if (iStr.length() == 0)
     return "";
   string  tReturnStr = "";
   unsigned int pos     = iStr.find(iDelimeteriter,0);
   if (pos != string::npos)
   {
      tReturnStr   = iStr.substr(0,pos);
      iStr = iStr.substr(pos + iDelimeteriter.length(),iStr.length() - pos);
   }
   else
   {
      tReturnStr   = iStr.substr(0,iStr.length());
      iStr = "";
   }
   return tReturnStr;



출처 http://clay.yozmn.com/851/13134


'C++' 카테고리의 다른 글

std::pair와 std::sort에 대한 기본 사용법  (0) 2014.01.07
random_shuffle  (0) 2013.08.09
convert int to string c++  (0) 2013.08.05
[펌][C++] String Tokenizer  (0) 2013.08.05
Posted by 그래제길
이전버튼 1 이전버튼