Skip to content

string {C++}

std::string 과 std:;basic_string과의 차이점을 설명해주세요#

std::stringstd::basic_string<char>입니다. 그러니까, char 타입으로 특수화된 객체인거죠.

basic_string과 char_traits의 차이점을 설명해주세요#

basic_string템플릿 클래스는 문자열 데이터가 저장하는 C 스타일 배열을 보관하는 기능을 다루고 char_traits템플릿 클래스는 문자열들을 어떻게 연산하는지에 대한 기능을 다룹니다.

char_traitsbasic_string이 사용하는 연산들 중 대소, 동등, 길이 등을 제공합니다. 따라서, 사용자가 이를 오버라이드 하여 별도의 정렬규칙을 적용하거나 대소문자를 무시하는 로직을 짤 수 있습니다.

Short String Optimization(SSO)에 대해서 설명해주세요#

basic_string이 저장하는 문자열의 길이는 특정할 수는 없지만 많은 경우 길이가 짧은 문자열을 생성하고 소멸합니다. 이 경우 매번 동적할당과 free를 반복하게 되면 굉장히 비효율적입니다. 따라서 길이가 작은 문자열을 생성하게 될 경우 객체 멤버에 저장해 버리는 최적화를 수행합니다.

하지만 모든 라이브러리가 SSO를 하는 것은 아니며, 이는 구현체에 따라 달라질 수 있어 주의를 요하는 부분입니다.

multi line string in C++#

string s = R"(#include <iostream>
int main(void) {
    std::cout << "Hello, world" << std::endl;
    return 0;
}
)";

Encoding#

UTF-8, UTF-16, UTF-32의 차이점이 뭔가요?

UTF-8은 유니코드 문자열을 최소 1바이트, 최대 4바이트로 표현하는 방식을 의미하고 UTF-16은 2 또는 4바이트로 표현하는 방식을 의미하며, UTF-32는 모든 유니코드를 4바이트로 표현하는 방식을 뜻합니다. 웹에서는 효율적으로 문자열을 취급하기 위해 UTF-8을 사용합니다.

한 글자 한 글자의 바이트수가 다르기 때문에 단순 인덱싱으로는 원하는 글자가 나오지 않습니다. 따라서 UTF-16 또는 32 문자열을 사용하거나 유니코드 규칙에 따라 비트마스크를 사용하여 글자의 바이트 수를 직접 파악하는 방법이 있습니다.

2024-01-14 추가

UTF8 -> 16 또는 32로 변환해서 편하게 인덱싱 & 사이즈 측정하면 좋지 않을까 생각했으나, 생각해보니 그럼 메모리 공간을 두배 + a 사용하게 되는 것이다. 그래서 포프 아조씨는 자기만의 string 라이브러리를 만들어놓고 유니코드로 작업이 필요할때마다 해당 라이브러리를 불러다 쓴다고 했다.

int len = 0;
while (*s) {
    len += (*s++ & 0b11000000) != 0b10000000;
}

string_view (C++17~)#