2012-02-23 2 views
0

c-strings에서 적절한 크기의 메모리를 할당해야합니다. 문자열 연산에서 재 할당을 피하기 위해 C# 또는 Java에서 Stringbuilder와 같은 것을 사용하거나 C에서 - 문자열에 더 많은 메모리를 할당 할 수 있습니다. 그러나 우리가 사전에 메모리 요구 사항을 모르는 경우 여전히 문제가 될 수 있습니다. 연결된 목록과 같은 구현이 있습니까? 나는 그것의 노드C-string을 연결된 목록으로 만드시겠습니까?

liststring a(4); // requested block size 
a.append("hello "); 
a.append("world"); 
// should create three nodes, 4 bytes allocated for each 
// "hell" -> "o wo" -> "rld" 
a.c_str(); // "hello world"; 

에서 C-문자열을 생성 메모리 및 방법 c_str() 블록의 목록을 할당하는 의미 또는 우리가 재 할당을 피하려는 경우 우리는 다른 접근 방식을 사용합니까? 나쁜 생각인지 설명해주세요.

+0

c_str()을 호출 할 때 어쨌든 문자열을 인접한 메모리 버퍼에 넣어야하므로 일반적으로 처음부터 그렇게하는 것이 좋습니다. 고정 된 크기의 블록의 링크 된 목록을 사용한다는 것은 긴 문자열을 작성하는 것이 할당에서 O (n)을 소비하는 반면, 문자열의 일반적인 지수 증가 할당 전략은 O (log (n))을 소비하여 더 많은 메모리를 낭비한다는 의미입니다. –

+0

그러나 우리가 여러 번 덧붙이고 싶고 얼마나 많은 크기인지 알지 못하는 경우에는 너무 적은 바이트 (재 할당이 필요함) 또는 너무 많은 메모리 (낭비)를 할당 할 수 있습니다. –

+0

알고리즘은 4 배 이상의 문자열 길이를 사용하지 않도록 보장하며 각 재 할당에는 평균적으로'O (1)'시간이 소요됩니다. 버퍼의 현재 크기가'n'이고 문자열의 길이가 버퍼를 벗어나는 경우'2 * n' 크기의 버퍼를 재 할당해야합니다. 'n/4'보다 작 으면 'n/2'크기의 버퍼를 재 할당해야합니다. – citxx

답변

3

문자열을 트리로 유지하는 데이터 구조에 대해서는 Ropes 문서를 참조하십시오. 그것은 당신의 아이디어와 비슷합니다.

+0

훌륭합니다, 이것이 제가 찾고 있던 것입니다! –

0

표준 방법이 없습니다. 그러나 당신은 C 문자열에 chars와 변환의 당신의 자신의 연결리스트를 구현할 수있다.

0

나는 C++이 아니라고 가정합니다. C이 아닙니다.

C++에서 문자열 조작에 대한 표준 클래스는 표준 : : 문자열입니다.

의 문자열 클래스 Java 또는 은 변경할 수 없습니다. std :: string은 변경 가능하므로 StringBuilder과 정확히 일치합니다.

+0

아니요, C를 의미하지만 C++도 괜찮습니다. std :: string은 내가 원하는 기능을 제공하지 않습니다. 아니면 그렇습니까? –

+0

아마도 내가 아는 모든 구현이 메모리에서 연속적이기 때문에 아마 그렇지 않을 것입니다. AShelly의 대답을 참조하십시오 : 그것은 당신이 찾고있는 것입니다. – ZunTzu

관련 문제