2011-08-12 2 views

답변

3

1) 예, 변경할 수 있습니다. 연산자 [] 및 at()은 모두 문자에 대한 const가 아닌 참조를 반환하며 바운드 검사를 원할 경우 name[7] = 'X' 또는 name.at(7) = 'X'과 같이 왼쪽에서 사용할 수 있습니다.

2) 한 문자를 변경하는 데 드는 비용이 매우 낮습니다. C 문자열과 매우 비슷하거나 비슷합니다 (범위 검사의 비용에는 at()이 추가되었습니다). 표준에서 요구하지는 않지만 std :: string 메모리의 연속 블록에 문자열을 저장합니다 (Meyers가 올바르게 기억되는 경우). 따라서 문자를 일정 위치로 변경하면 일정 시간이됩니다.

일반적으로 널리 사용되는 문자열 조작의 복사 및 내부 버전을 제공하는 boost string algorithms도 참조하십시오.

+1

스펙은 내부 표현이 연속적 일 것을 요구하지 않지만 _does_는'at'와'operator []'둘 다 일정 시간이 필요합니다. – Nemo

+1

C++ 0x에서 인접성은'std :: string' 구현에 대한 요구 사항이됩니다. – pmr

+0

굉장해! Nemo와 pmr에게 감사드립니다! – olooney

0

예.

문자를 찾는 선형 (그러나 색인을 이미 알고 있다면 상수 임). 귀하의 질문에 대한 실제적인 의미는 일정한 시간을 의미합니다. 대체 점은 정수의 문자열 표현을 실제로 의미하는 경우 대체 점 뒤의 문자 수에서 선형입니다.

1

예, std::string의 내용을 수정할 수 있습니다. std::string::operator[] 등을 사용

:

std::string str("foo"); 
str[0] = 'b'; 
std::cout << str << std::endl; 

가 출력 "boo".

단일 문자를 교체하는 데 드는 비용은 플랫폼에서 해당 메모리 위치 비용으로 캐릭터를 복사하는 것입니다. 아마별로.

1

예, 변경할 수 있습니다. 당신이 뭔가를 의미하는 경우

:

std::string s("space\n"); 
int i = 'i'; 
s[2] = (char)i; 
std::cout << s; // prints 'spice' 

자세한 구현 정의하지만, 세 번째 줄은 일반적으로 구성

  • 추가

    1. 로드 문자열에서 포인터 값을 그것에 색인을 붙이십시오
    2. 그 주소에 바이트 상점을 실행하십시오

    그래서 값이 쌉니다. 디버그 모드에서 범위 검사 등이있을 수 있으며 거기에는 다른 코드가있을 수 있지만 위의 내용은 기본적으로 수행해야하는 작업입니다.