2015-01-25 2 views
0

문자열에서 다른 문자로 일부 문자를 복사하려는 루프에서 작업하고 있습니다. 나는 루프 외부에서이 작업을 수행 할 수 있도록 제한은 20 자입니다 알고QString :: clear() 함수를 사용하여 Qt 문자열의 예약 된 공간을 잃어 버리십니까?

QString name; 
name.reserve(25); 

내가 작성 될 버퍼를 준비하고 Qt는 그것의 이름은 구문 분석 할 때마다 재 할당 피할 그런 식으로. 단, 이름을 얻으려면 다음과 같이하십시오.

for(int i(0); i < 20 && *s != '\0'; ++i) 
{ 
    name += *s; 
} 

즉, 매번 이름을 재설정해야합니다. 어떻게해야하고 예약 된 공간이 매번 손실되지 않는지 확인하십시오.

// will reserved memory be lost after this call? 
name.clear(); 

// would that be more likely to keep the memory buffer? 
name = ""; 

설명서가 어떤 식 으로든 말하지 않는 것 같습니다.

루프의 전체 집합은 이런 식입니다 : QString::clear()를 호출

QString name; 
name.reserve(25); 

for(QChar const *s(input.data()); *s != '\0'; ++s) 
{ 
    ...snip... 
    if(<some condition>) 
    { 
     name.clear() // losing reserved data here? 
     for(int i(0); i < 20 && *s != '\0'; ++i) 
     { 
      name += *s; 
     } 
     ...snip... 
    } 
    ...snip... 
} 
+0

'name.clear()'가 내부 버퍼를 지우지 만'name + = ... '이 확실히하지 않는다면 확실하지 않습니다. 당신이 실제로'clear()'를 통해 버퍼를 보존 할 필요가 있는지, 또는 어떤 이유로'+ ='가'clear()'와 같은 효과를 가지고 있다고 생각하는지는 명확하지 않습니다. –

+0

'.clear()'가 궁금합니다. '+ ='를 수행하는 루프는 다른 루프 안에 있으므로'name + = * s; '가있는 루프가 발생할 때마다 예약 된 버퍼를 유지하려고합니다. –

답변

4

이 예약 된 공간이 손실 될 수 있습니다.

QString s; 
s.reserve(25); 
qDebug() << "Before Clear: " << s.capacity(); 
s.clear(); 
qDebug() << "After Clear: " << s.capacity(); 

출력 :

Before Clear: 25 
After Clear: 0 

당신의 예약 된 공간을 잃지 않고 문자열의 내용을 제거하는 가장 효율적인 방법은 전화 QString::resize() :

QString s; 
s.reserve(25); 
qDebug() << "Before Resize: " << s.capacity(); 
s.resize(0); 
qDebug() << "After Resize: " << s.capacity(); 

출력 다음 사항을 고려 :

Before Resize: 25 
After Resize: 25 

QString::resize()의 구현에서 예약 된 용량을 가진 문자열에 대해 resize(0)을 호출하면 내부 크기 값을 0으로 설정하고 내부 버퍼의 첫 번째 문자를 '\0'으로 설정합니다.

관련 문제