선택적 요소로 C ++ 17 벡터 쌍을 초기화하는 방법


34

C ++ 17에서 선택적 요소로 쌍 (또는 튜플) 벡터를 어떻게 선언하고 초기화합니까?

    std::vector<std::pair<int, optional<bool> > > vec1 = { {1, true},
                                                           {2, false}, 
                                                           {3, nullptr}};

두 번째 요소가 null / 선택적 일 수있는 쌍이 있습니다.


1
std::piecewise_construct흥미로운 대안을 제공 할 수도 있습니다.
마크 글리스

4
이것이 귀하의 질문에 대답합니까? std :: optional <T>에 "nothing"을 할당하는 방법?
Julien Lopez

@JulienLopez 과제에 대해 이야기하고 있습니다.
LF

@LF 관련이없는 컨텍스트를 제거 할 때도 같은 질문입니다. 빈 옵션을 작성하는 방법은 무엇입니까?
Julien Lopez

1
@JulienLopez C ++에서 초기화와 할당은 일반적으로 매우 다릅니다. 두 질문에 솔루션이 겹친다 고해서 동일한 질문을 의미하는 것은 아닙니다. 특히 reset여기서 사용하고 싶지 않습니다 .
LF

답변:


49

std::nullopt대신 찾고 nullptr있습니다.

std::vector<std::pair<int, std::optional<bool> > > vec1 =
  { {1, true}, {2,false}, {3,std::nullopt} };

3
(핫 네트워크 질문 링크에서 여기로 옴) C ++ 코드는 항상 std::이와 같이 스팸 합니까? 왜 그냥 using std::vector친구가 아니에요 vector<pair<int, optional<bool>>? 더 산뜻하게 읽습니다
Alexander-Reinstate Monica

17
@ Alexander-ReinstateMonica "더 이상하게 읽습니다"는 주관적입니다. 가독성 인수의 다른 측면은 다음과 같이이다 : 나는 모든 알아낼 파일의 상단에 방법 돌아가고 싶지 않아 하는 특히 vector , pair, optional이 라인에 사용하고, 등 I를. 네임 스페이스를 인라인으로 포함하면 해당 기능의 출처와 기능을 명확하게 알 수 있습니다. 라인은 독립적입니다. 네임 스페이스 충돌을 완전히 피하기 때문에 더 큰 프로젝트에는 특히 그렇지만 간결한 코드 예제에도 유용합니다.
probably_someone

3
@ Alexander-ReinstateMonica 방금 작성한 코드를 사용하는 코드를 완전히 감독하고 제어하는 ​​경우 (충돌이 발생하는 경우를 제외하고 정확하게 알고 있기 때문에)이 논리는 괜찮습니다. 그러나 다른 개발자들이 사용할 라이브러리 또는 API를 개발하는 등의 작업을 수행하는 경우 충돌이 발생했는지 여부를 파악하기 위해 모든 단일 사용을 감독 할 수는 없습니다. 일반적으로 (상대적으로는) 충돌이 발생하지 않는 것이 좋습니다. 누군가 제품이 파손되었다고 불평 한 후에 만 ​​충돌을 수정하는 것보다 낫습니다.
아마

3
@ Alexander-ReinstateMonica 다음 중 최상위 레벨 이름은 std무엇입니까? arg, count, find,size
LF

4
@ Alexander-ReinstateMonica std::는 나에게 눈에 거슬리지 않습니다. 네임 스페이스의 이름이 훨씬 길면 달라집니다.
Carsten S

24

또는 간단한 사용 기본 구성 :

std::vector<std::pair<int, std::optional<bool>>> vec1 {
    {1, true}, {2,false}, {3,{}}
};

6
이것이 작동하는 동안 std::nullopt의사 소통을 잘한다.
Williham Totland
당사 사이트를 사용함과 동시에 당사의 쿠키 정책개인정보 보호정책을 읽고 이해하였음을 인정하는 것으로 간주합니다.
Licensed under cc by-sa 3.0 with attribution required.