Programming

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;
}

댓글 한 개

답글 남기기