2015-01-26 2 views
1

C++에 익숙하지 않은데, 단지 1 주일 정도면 중첩 된 집합을 반복하고 내부 집합의 각 요소를 파일의 한 줄에 작성하고 싶습니다. 각 내부 세트에는 3 개의 요소가 있으며 세 줄을 모두 같은 줄에 넣고 싶습니다. I가 설정 한 다음과 같이집합을 반복하는 방법 C++

// Define "bigSet" and initiate as empty set "Triplets" 
    typedef set < set<string> > bigSet; 
    bigSet Triplets; 

나는 그것을 통과하는 이런 종류의 일을 시도했지만 그것은 나에게 오류를 제공합니다 ...

어떤 도움이 크게 감사합니다
// Iterate through and print output 
    set <string>::iterator it; 
    for(it = Triplets.begin(); it != Triplets.end(); it++){ 
     cout << *it << endl; 
    } 

들 감사합니다 !

+0

'bigSet'의 각 요소는'set'이므로'bigSet'을 반복하는 것과 거의 같은 방법으로 각 요소를 반복해야합니다. – Galik

+0

나중에 참조 할 수 있도록 항상 정확한 오류 메시지를 포함 시키십시오. –

답변

2

내가 이런 식으로 할 것이라고 생각 : Triplets.begin() 유형 set<string>::iterator의이 아니기 때문에

// Iterate through and print output 
    set < set <string> >::iterator it_ex; // iterator for the "outer" structure 
    set <string>::iterator it_in; // iterator for the "inner" structure 

    for(it_ex = Triplets.begin(); it_ex != Triplets.end(); it_ex++) 
    { 
     for(it_in = it_ex->begin(); it_in != it_ex->end(); it_in++) 
      cout << *it_in << ", "; 
     cout << endl; 
    } 
+0

'for '앞에 반복기를 선언하는 이유는 무엇입니까? 그것은 매우 독립적입니다. ('for'에서 iterators를 선언하는 것은'auto'가 적절한 곳입니다. C++ 11이 있습니다. 실제로,'auto '가 언어에 추가 된 이유입니다.) –

+0

동의합니다. 이 방법을 사용하여 가독성을 높이고 초보자를 더 잘 이해할 수 있습니다. 'auto'는 훌륭하지만 여러분이하는 일을 정확히 알지 않는 한 사용할 것이 아닙니다. –

2

세 쌍둥이는 set<string>이 아닙니다. 그것은 set<set<string>>; 여러 문자열을 포함 할 수있는 것보다 Triplets의 각 항목 자체는 set입니다.

반복기는 컨테이너 유형과 일치해야합니다. 중첩 된 컨테이너의 두 가지 수준으로, 당신은 두 번 반복해야합니다

set<set<string>>::iterator it; 
set<string>::iterator it2; 
for(it = Triplets.begin(); it != Triplets.end(); it++) { 
    for (it2 = it->begin(); it2 != it->end(); ++it2) { 
     cout << *it2 << endl; 
    } 
} 
+0

@NeilKirk 참으로; 내 대답을 편집하여 명확하게 만들었습니다. – etienne

1

Tripletsset < set<string> >을 입력이므로 유형 set < set<string> >::iterator 또는 bigSet::iterator의 반복자를 필요로한다. 유형이 set <string>이 아닙니다. const_iterator을 사용할 수도 있습니다.

반복하는 경우 Triplets은 문자열이 아닌 다른 집합에 대한 반복자를 제공합니다.

는 또한

for (const auto& i : Triplets) 
{ 
    for (const auto& j : i) 
    { 
     cout << j << endl; 
    } 
} 
1

오류를 가지고, 그것은 set<set<string>>::iterator입니다.

당신이해야 할 일은 두 세트의 루프가 있습니다 : 하나는 바깥 쪽 세트를 반복하고 다른 하나는 안쪽을 반복하는 것입니다. 당신이 반복자에 증가/감소 연산자 (++/--)를 사용하는 경우

set<set<string>>::iterator it; 
for(it = Triplets.begin(); it != Triplets.end(); ++it) 
{ 
    set<string>::iterator it2; 
    for(it2 = it->begin(); it2 != it->end(); ++it2) 
    { 
     cout << *it2; 
    } 

    cout << endl; 
} 

, 접두사 버전 (++it) 대신 접미사들 (it++)를 사용하는 것이 좋습니다 수 있습니다. 이는 접미사가 증가하기 전에 반복기의 사본을 작성하기 (및 그 사본이 리턴 됨) 때문이지만, 이와 같은 경우에는 필요하지 않습니다.

또한, 당신이, 당신이 사용할 수있는 C++ 11을 사용하는 경우 범위 기반 것들을 많이 단순화 루프와 auto 키워드에 대해 :

for(const auto &innerSet : Triplets) 
{ 
    for(const auto &innerSetElement : innerSet) 
    { 
     cout << innerSetElement; 
    } 

    cout << endl; 
} 
+0

훨씬 더 좋았지 만'for'를 기반으로하는 범위에서는'auto'를 사용하지 않았습니다. 클래식 이터레이터 이외의 다른 유형의 경우 철자법은 난독 화입니다. –

+0

참이지만 코드에 따라 다르지만, 이름을 올바르게 지정하면 문제가되지 않습니다. 여기에 그런 참조를 명명 했으므로 OP가 숨기는 부분을 이해하는 것이 쉬우나 '자동'을 표시하는 것이 더 쉽습니다. – woytaz

0

첫째 : 그들은 세 쌍둥이라면, std::set이 내부 값에 대해 원하는 유형인지 확인하십시오. 아마도 class은 일 것이며,이 경우` 클래스에 대해 operator<<을 정의하면 간단한 루프가 제대로 작동합니다.

class Triplet 
{ 
    std::string x; 
    std::string y; 
    std::string z; 
public: 
    // Constructors to enforce that none of the entries are identical... 
    // Accessors, etc. 
    friend std::ostream& operator<<(std::ostream& dest, Triplet) 
    { 
     dest << x << ", " << y << ", " << z; 
     return dest; 
    } 
}; 

그리고 출력 : 같은 뭔가

for (Triplet const& elem : Triplets) { 
    std::cout << elem << std::endl; 
} 

그렇지 않으면 : 당신은 출력에 사용할 형식을 정의해야합니다. 에서는 특히 줄에있는 문자열 사이에 구분 기호가 필요합니다. 즉, 적어도 내부 루프 용이 아닌 for을 기반으로하는 범위를 사용할 수 없음을 의미합니다. '세 쌍둥이의 세트가 큰 경우

for (std::set<std::string> const& triplet : Triplets) { 
    for (auto it = triplet.cbegin(); it != triplet.cend(); ++it) { 
     if (it != triplet.cebegin()) { 
      std::cout << ", "; 
     } 
     std::cout << *it; 
    } 
    std::cout << std::endl; 
} 

(, 당신은 확실히 '\n'std::endl 교체 을 고려해야 할 것이다 그러나 정말 큰 경우 물론, 당신은 아마 원 : 당신은 뭔가를해야합니다. std::cout으로 출력됩니다.)

관련 문제