2016-10-14 6 views
0

C++의 목록에 단어를 추가 할 때 단어를 정렬하려고합니다. 목록을 사용해야하며 "sort()"함수를 사용할 수 없습니다.List (C++)에 요소를 추가 할 때 요소를 어떻게 정렬합니까?

일부 단어가 포함 된 텍스트 파일이 있습니다 (각 단어는 줄 바꿈에 있음).

은 지금까지 나는 단어를 수집하고 목록에 추가하는 방법을 알아 낸 :

fstream myfile(fileName); 

if(!myfile) { // Test if file open 
    cout<<"Error opening file"<< endl; 
    return false; 

} 

while (getline(myfile, line)){ //loops through and gets sayings 
    l.push_back(line); 
} 

단어는 단지 그들이 파일에있는 순서대로 추가됩니다. 내가하고 싶은 일은 단어의 첫 글자를 확인한 다음 목록의 끝에 추가하는 대신 목록의 적절한 위치에 넣는 것입니다.

미리 감사드립니다.

대한 추가 정보 :

나는이 작업을 수행하는 반복자를 사용하는 가정하고 생각합니다.

for (list<string>::iterator it=l.begin(); it != l.end(); ++it) 
cout << *it << endl; 

가 어떻게 내가 그들을 추가하기 전에 값을 비교하는 사용합니다 :

나는 목록을 표시하는 반복자를 사용하는 방법을 알아? (*it)[0]을 사용하여 이터레이터를 사용하여 단어의 첫 번째 글자를 가져 오려고했지만 올바른 구문이 아닙니다.

+2

'std :: multiset' (또는'std :: set')을 사용할 수 있습니까? 아니면 할 수없는 일입니까? – krzaq

+0

* 내가하고 싶은 것은 단어의 첫 글자를 확인한 다음 목록의 적절한 위치에 두는 것입니다. * "정렬"로 간주되는 첫 글자 만 확인하는 방법은 무엇입니까? – PaulMcKenzie

+0

* 목록을 사용해야하며 "sort()"함수를 사용할 수 없습니다. * -'std :: list' ['sort()'함수와 함께 제공됩니다] (http://en.cppreference.com/w/cpp/container/list/sort). 이미'std :: list'를 사용하고 있다면 왜 그것을 사용할 수 없습니까? 나는 선생님들이 준 정말 미친 요구 사항을 보았습니다. 그러나 이것은 내가 들어 본 가장 미친 시험 중 하나입니다. – PaulMcKenzie

답변

0

당신이 std::set 또는 std::multiset 사용할 수있는 가정 :

multiset<string> l; 

while (getline(myfile, line)){ //loops through and gets sayings 
    l.insert(line); 
} 

이 모든 단어를 추가하고 자동으로 정렬합니다. multisetset의 주요 차이점은 전자는 중복을 허용하지만 후자는 허용하지 않는다는 것입니다.

그런 다음 for 루프 l을 반복 할 수 있습니다

for(string const& s : l) { 
    cout << s << endl; 
} 
1

나는 반복자

std::list<string> mylist; 
std::list<string>::iterator it; //now I can move through the list using this kind of like an index 

for (it=mylist.begin(); it!=mylist.end(); ++it) 
{ 
    if(line.compare(*it) >= 0) //If the line belongs before what *it is pointing to 
    { 
     mylist.insert(it,line); 
     break; 
    } 
} 

을 추가 할 것 http://www.cplusplus.com/reference/string/string/compare/

발견에 비교 : 문자열에 대한 자세한 내용을 보려면 목록에 삽입하는 방법에 대해 자세히 알아보기 http://www.cplusplus.com/reference/list/list/insert/

+0

저는 C++로 간신히 표면을 긁었지만 동급생이 이터레이터에 소개되었습니다. 여기서 볼 수있는 모든 것은 하나의 세부 사항을 제외하고는 의미가 있습니다. 해당 사항은 line.compare (* it) 왜 '*'가 표시됩니까? 나는 그것이 포인터라고 생각하고 싶다. 그렇지만 우리가 포인터를 사용해야하는 이유는 내게 이해가되지 않는다. –

+0

@BrettReinhard - 반복자는 사실 포인터이기 때문에 * 액세스하여 (읽기 또는 쓰기) 요소. – rcgldr

+0

@rcgldr이 문제를 해결해 주셔서 감사합니다. 그래서 이것은 본질적으로 여러분이 배열을 전달하는 것과 비슷한 주소를 참조합니까? –

관련 문제