STL의 rope container
rope 컨테이너는 C++에서 문자열을 담기 위해 가장 일반적으로 사용되는 string의 확장이다. 말 그대로 해석하자면, rope는 밧줄이니까 string(끈)보다 강력할 것이다.
SGI에서 제안한 스펙이며 GCC에서 채택되었다. (GCC 3.2.3, 3.4.6, 4.3.3에서 제공되고 있는 것을 확인하였음)
SGI 문서에 따르면 장단점은 다음과 같다.
장점
– concatenate, substring, insert 연산이 훨씬 빠름
– 공간 활용도가 높음
– assign은 내부적으로 pointer assignment로 구현되어 있으며, 레퍼런스 카운트를 이용한 copy-on-write보다도 효율적으로 동작함
단점
– 1글자 교체가 비싼 연산임
– 어떤 글자를 찾는 연산이 vector
– iterator가 12개 word의 크기와 맞먹음. ++iter해야 안전함
전반적으로는 커다란 문자열을 이어붙이고 잘라내는 용도로 적합하지만 C 스타일로 한 글자씩 다루는 것에는 그다지 적합하지 않은 컨테이너이다. 물론 const_iterator를 이용하여 random access하는 것은 빠르다. 그러나 non const_iterarator를 가지고 문자열을 변경하게 되면 성능 저하가 심각해진다.
어지간한 연산자나 method는 string과 거의 비슷하다. string 대신에 crope이라고 쓰면 된다.
새로운 method로 delete_c_str()이 추가되었는데, 이 method는 실제 문자열이 저장되는, c_str()이 가리키는 메모리 공간을 회수한다.
#include#include #include using namespace std; using namespace __gnu_cxx; int main(void) { // string처럼 assign, concatenate 등이 가능함 crope a; a = "hello"; a += " world"; cout << a << endl; // string처럼 특정 문자를 반복하여 문자열로 만들 수 있음 crope b(10, 'b'); cout << b << endl; // substr crope c = "hello world"; cout << c.substr(3, 4) << endl; c.push_front('j'); cout << c << endl; // from char pointer char text[] = "c c++ java python perl"; crope d = crope(text); cout << d << endl; // copy crope e("original"); crope f; copy(e.begin(), e.end(), sequence_buffer (f)); cout << e << endl; cout << f << endl; crope g("gnu linux gcc guile"); char buffer[1024]; g.copy(1, 2, buffer); cout << g << endl; cout << buffer << endl; // not null-terminated cout << strlen(buffer) << endl; return 0; }
댓글 한 개
핑백 :