2010-05-13 3 views
28

어떤 상황에서 다른 STL 컨테이너 위에 로프를 사용하게 될지 궁금합니다.STL 로프 - 사용 장소 및 시간

+0

나는 로프에 대해 들어 본 적이 없다 - 표준인가? – CiscoIPPhone

+1

@Neil (및 기타)이 지적했듯이 이것은 표준의 일부가 아니며 SGI 라이브러리의 일부인 추가 컨테이너입니다. – Konrad

+0

파이어 폭스가 '목록'을 어떻게 구현하는지 궁금하게 생각하면서 비슷한 동물에 대해 생각해 보았습니다. 나는 그들이 빠른 삽입/지울 수 있도록 비슷한 기술을 사용한다고 생각한다. –

답변

37

로프는 확장 문자열 구현 있습니다 : 그들은 전체 문자열을 포함 효율적인 운영을 위해 설계되었습니다. 할당, 연결 및 하위 문자열과 같은 작업은 문자열의 길이에 관계없이 거의 시간이 걸립니다. C 문자열과는 달리 로프는 편집 버퍼 또는 메일 메시지와 같이 매우 긴 문자열 ( )을 합리적으로 표시합니다.

장점 : 긴 문자열을 포함하는

  1. 훨씬 빠른 연결 및 문자열 작업. 예를 들어, 원본의 사본이 보관되는 경우에도 10 메가 바이트 로프의 중간에 문자를 삽입하면 은 마이크로 초의 10 초를 넘어야합니다. 편집 기록의 일부로 대조적으로, 이것은 에 대한 초 단위로 나타납니다 종래의 "플랫"문자열 표현. 연결에 필요한 시간은 대부분의 응용 프로그램에서 일정한 숫자 인 으로 볼 수 있습니다. 텍스트 편집기 안에 파일 표현으로 로프를 사용하는 것이 가장 합리적입니다.

  2. 잠재적으로 더 나은 공간 성능. 로프의 사소한 수정은 원본과 메모리를 공유 할 수 있습니다. 로프는 크게 메모리를

  3. 할당 단순히 (아마도 레퍼런스 카운트) 포인터 할당인지 큰 블록

    도입 단편화의 문제를 감소 작은 청크에 할당된다. 참조 계산 된 copy-on-write 구현과 달리, 복사본 중 하나가 나중에 약간 수정 된 인 경우에도 대부분 으로 유지됩니다. 검사 점에 매우 저렴한 입니다. 문자열의 버전입니다 (예 : 편집에서 기록입니다.

  4. 문자를 생산하는 로프로 볼 수 있습니다. 따라서 로프 조각은 문자열의 섹션을 검사 할 때 읽기 전용 인 100MByte 파일 일 수 있습니다. 의 끝에 문자열을 연결하면 해당 파일에 을 읽지 않습니다. (현재이 시설의 구현은 불완전합니다.)

http://www.sgi.com/tech/stl/Rope.html

7

큰 데이터 크기를 처리하는 string의 비표준 대안입니다. 작동 방식은 here을 참조하십시오.

2

난 전혀 사용하지,하지만 내가 "쉽게 휴대"괴물의 비트 해요, 그리고 늪지 표준 컨테이너를 사용하는 경우에만 경향이 있기 때문입니다. 로프는 SGI의 STL 구현의 일부이며 C++ 표준의 일부가 아닙니다.

+1

+1 내가 처음 읽은 곳이지만 표준에 포함되지 않았다는 것을 깨닫지 못했습니다. – Konrad

+1

한편, 코드를 복사하는 것이 쉬울 수도 있습니까? 아니면 SGI STL 라이센스가 그것을 방지합니까? –

+10

-1 STLPort (libre/free) 및 libstdC++ (GNU gcc)는 모두 을 지원합니다. 그것은 특정 작업을하는 데 필요한 클래스입니다.이 클래스는 묻는 사람이 요청한 것입니다. – unixman83

1

로프의 유일한 나쁜 점은 스레드와 오용입니다.

Linux (및 대부분의 다른 OS)에서는 스레드 안전 코드가 로프를 너무 느리게 만드는 이유입니다. 그래서 임베디드 플랫폼에서 단일 스레드를 사용하기 때문에이 코드를 찢어 버리십시오 (컴파일러 def를 threads-off).

그렇지 않으면 로프가 문자열보다 훨씬 빠르며 큰 버퍼에서 메모리가 부족해질 가능성이 적고 큰 버퍼를 편집하는 데 훨씬 빠릅니다. 성경 중간에 나쁜 성격을 제거하는 것.

이것은 로프가 데이터로 해석되는 방식 때문입니다. 조금 더 작은 '문자열'이 링크 된 목록을 통해 함께 묶여 최종 문자열을 생성합니다.

+3

"로프는 문자열보다 훨씬 빠릅니다": 모든 작업이 아닙니다. 로프의 문자를 색인으로 검색하는 것은 문자열보다 로프보다 빠릅니다. –

+0

@Alexandre,하지만 이것은 std :: string의 경우에도 *** 나쁜 습관입니다. 이 경우 문자의 벡터를 사용하는 것이 훨씬 좋습니다. – unixman83

+4

C++ 0x 문자열은 연속적으로 문자를 저장할 수 있으므로 더 이상 나쁜 관행이 아닙니다. –

2

문자로 구성된 문자열에는 많은 강조점이 있지만 로프는 빠른 삽입 및 삭제 (시퀀스 내의 모든 위치)가있는 단순한 1D 시퀀스입니다.

문자열과 같은 다른 기능에는 이러한 기본 기능이 거의 필요하지 않습니다. 정수 로프는 어디에서 사용합니까? 모르겠다. 조작을 위해서는 어딘가에서 색인이 필요하기 때문이다.

현실적인 인위적인 사례는 사용자가 수천 개의 이미지로 구성된 데이터 세트를 볼 수있게 해주는 UI를 만드는 것이고 사용자는 그 중 일부를 삭제하고 순서를 재 배열 할 수 있어야합니다. 다른 사람들의

+0

텍스트 편집기는 로프 데이터 구조의 유용성에 대한 실용적인 예제가 아닙니다. – JJF