>source

저는 수억 개의표준::문자열사물. 이 문자열을 여러 컨테이너에 저장하고 있으므로 이러한 개체의 수(복사)가 곱해지고 내 프로그램에 큰 병목 현상이 발생합니다.

해결책을 마련하려고 노력 중이며 온라인 조사를 통해 지금까지 진행했습니다. 기본적으로 내 생각은 내가 구성한 문자열이 일정하고 불필요하게 복사된다는 점을 감안할 때 대신 내 고유의 C 유형 문자열(char 배열)을 할당하고 컨테이너 간에 이러한 포인터를 공유하고 싶습니다. 조회, 삽입 등...).

내가 사용하는 주요 용기는표준::벡터,표준::맵,std::unordered_set. 마지막 두 가지 경우에는 이러한 컨테이너를숯*유형. 나는 stackoverflow의 도움을 받아 사용자 정의 해시 함수를 만들었습니다.std::unordered_set그리고숯*비교(보다 작음, "< ") 같은std::map<_,_,미만>.

제 질문을 명확하게 하기 위해 나열하겠습니다.

  1. 기술적인 문제를 다루기 전에 이것이 달성 가능한지, 표준적인 용도인지, 아니면 노력할 가치가 있습니까?
  2. 비교 기능이 작동하고 삽입에 성공했습니다. 그러나 두 포인터가 동일한 문자열을 가리킬 수 있지만 내부에서 다른 키처럼 작동한다는 점을 감안할 때std::ordered_set그리고표준::맵, 다음과 같은 방법을 사용할 수 있으려면 등호 연산자 오버로드와 같은 것이 필요합니까?포함또는삭제. 예를 들어const char* p1= "베타"그리고const char* p2= "베타",표준::맵::지우기(p1)항목을 삭제할 수 있어야 합니다p2내부에 있는 경우표준::맵(두 가지 가정"베타"'는 다른 메모리 위치 안에 있습니다.`).
  3. 만약 내가 분명히 했다면 더 좋은 방법이 없을까요?

시간 내주셔서 감사합니다.

이동 및 전달이 옵션이 아닌 복사 대신 참조입니까? std::string에서 전환하려는 경우 오류 검사가 충분하지 않다고 거의 보장할 수 있습니다.

sweenish2021-12-16 02:18:11

자, 그것은 잠재적인 디자인 문제처럼 들립니다.

sweenish2021-12-16 02:18:11

std::string_view가 옵션일 수 있습니다...

Jarod422021-12-16 02:18:11

물론 어리석은 인코딩 없이도 Microsoft Component Object Model의 BSTR과 같은 일종의 참조 카운트 문자열을 찾고 있는 것 같습니다. 문자열은 변경할 수 없습니까? 또한 char* p1= "beta"는 장난이 아니므로 컴파일하면 너무 관대한 C++ 컴파일러를 갖게 됩니다.

Bathsheba2021-12-16 02:18:11

나는 수억 개의 std::string 객체를 생성해야 합니다 --이러한 문자열 중 서로 중복되는 문자열이 있습니까? 중복이 많을 경우 플라이웨이트 디자인 패턴이 옵션이 될 수 있습니다. 부스트에는 하나가 있습니다.

PaulMcKenzie2021-12-16 02:18:11

더 좋은 방법이 있습니까? 먼저 우리는 당신의 프로그램이 그 질문에 답하기 위해 정확히 무엇을 하는지 알아야 합니다. 이제 당신은 그것이 무엇을 하는지 설명하지 않고 "당신의 방식"을 설명했습니다.

Marek R2021-12-16 02:18:11

내가 읽은 바에 따르면 데이터베이스를 사용하는 것이 좋습니다. 평균 20개의 문자가 있는 1억 개의 문자열이 2Gbyte 데이터라고 상상해 보십시오. 데이터베이스는 필요한 모든 작업을 고속으로 수행합니다. 모든 종류의 정렬, 구별 및 관계. 나는 그것을 사용할 것입니다. 하지만 내가 모르는 요구 사항 이 있을 수 있습니다 . . .

Armin Montigny2021-12-16 02:18:11
  • 이전 Git 강제 실행 또는 가짜 커밋 거부
  • 다음 opencv python을 사용하여 닫힌 곡선에서 색상을 올바르게 채우는 방법