2013-11-10 3 views
1

벡터 을 정렬하는 데 실패 나는 다음과 같은 코드를 가지고 : 나는 그것을 실행할 때 표준 : 종류는 표준의 요소 :

#include <stdio.h> 
#include <stdlib.h> 
#include <string> 
#include <vector> 
#include <algorithm> 
#include <iostream> 
#include <iterator> 
#include <boost/foreach.hpp> 
#include <boost/tokenizer.hpp> 
#include <fstream> 
#include <streambuf> 

bool cmp(const std::string& lhs, const std::string& rhs) { 
    return lhs < rhs; 
} 

int main(int argc, char **argv){ 
    /* USAGE: PROGRAM FILENAME DELIMITER */ 
    if (argc != 3){ 
     fprintf(stderr, "./program filename delimiter \n"); 
     exit(EXIT_FAILURE); 
    } 

    char *filename = argv[1]; 
    char *delimiter = argv[2]; 

    std::vector<std::string> vWords; 
    std::vector<std::string> vWords_TMP; 
    std::ifstream t(filename); 
    std::string str((std::istreambuf_iterator<char>(t)), 
        std::istreambuf_iterator<char>()); 
    boost::char_separator<char> sep(delimiter); 
    boost::tokenizer< boost::char_separator<char> > tokens(str, sep); 
    BOOST_FOREACH (const std::string& t, tokens) { 
     vWords.push_back(t); 
    } 
    vWords_TMP = vWords; 
    for(std::vector<std::string>::const_iterator i = vWords.begin(); i != vWords.end(); ++i) std::cout << *i << '\n'; 
    std::sort(vWords_TMP.begin(), vWords_TMP.end()); 
    for(std::vector<std::string>::const_iterator i = vWords_TMP.begin(); i != vWords_TMP.end(); ++i) std::cout << *i << '\n'; 
} 

그러나, 표준이 :: 종류의 벡터를 정렬하는 데 실패합니다. I 입력 다음 파일을

> FILE 
UUUUUUUUUUUUUUUUUUUUU 
AAAAAAAAAAAAAAAAAAAAA 
KKKKKKKKKKKKKKKKKKKKK 
BBBBBBBBBBBBBBBBBBBBB 
YYYYYYYYYYYYYYYYYYYYY 

이되어야 :

AAAAAAAAAAAAAAAAAAAAA 
BBBBBBBBBBBBBBBBBBBBB 
KKKKKKKKKKKKKKKKKKKKK 
UUUUUUUUUUUUUUUUUUUUU 
YYYYYYYYYYYYYYYYYYYYY 

을하지만 불행하게도 출력이 정렬 후 동일하다. 어떤 아이디어?

+3

게시 된 많은 코드는 문제와 관련이 없으며 사용자가 문제를 읽는 데 도움이 될뿐만 아니라 스스로 해결할 수 있도록 도와줍니다. – aaronman

+0

프로그램에 전달할 명령 줄, 특히 구분 기호는 무엇입니까? 당신은 조심스럽게 벡터의 끈에 인쇄되지 않은 문자가 있는지 검사 했습니까? 'getline'으로 입력을 읽고 정렬하면 예상대로 작동합니다. –

답변

1

을 보여 주었다으로 실제 정렬 알고리즘 자체가 작동 단일 문자열. 분명히 단일 요소를 정렬해도 아무런 변화가 없습니다.

대신 어떤 일이 발생할지 결정하는 것은 사용자의 책임입니다.

delimiter을 개행 문자로 사용한다고 가정합니다. 이 약자로 명령 행에서, 프로그램에 줄 바꿈을 통과의 내가 알고 있어요 유일한 방법은 다음과 같이이다 :

$ ./a.out file " 
> " 
pushing token: "UUUUUUUUUUUUUUUUUUUUU" 
pushing token: "AAAAAAAAAAAAAAAAAAAAA" 
pushing token: "KKKKKKKKKKKKKKKKKKKKK" 
pushing token: "BBBBBBBBBBBBBBBBBBBBB" 
pushing token: "YYYYYYYYYYYYYYYYYYYYY" 
UUUUUUUUUUUUUUUUUUUUU 
AAAAAAAAAAAAAAAAAAAAA 
KKKKKKKKKKKKKKKKKKKKK 
BBBBBBBBBBBBBBBBBBBBB 
YYYYYYYYYYYYYYYYYYYYY 
AAAAAAAAAAAAAAAAAAAAA 
BBBBBBBBBBBBBBBBBBBBB 
KKKKKKKKKKKKKKKKKKKKK 
UUUUUUUUUUUUUUUUUUUUU 
YYYYYYYYYYYYYYYYYYYYY 

(그리고 나는 당신이 원하는 생각하는 프로그램이 작동합니다 그것에)

명령 줄 인수로 개행을 전달하는 방법은 " 다음에 Enter 키를 누른 다음 "을 닫고 명령을 다시 실행하여 입력하는 것입니다.

+0

해결책은 당신의 대답의 일부입니다. 코드를 전혀 변경하지 않았지만 명령 줄 인수를 변경하여 원래 '\ n'대신 작성한 줄 바꿈 구분 기호를 지정했습니다. 이제는 잘 작동합니다. – shblsh

0

캐리지 리턴을 프로그램에 구분 기호로 전달할 수있는 방법이 표시되지 않으므로 다른 것을 전달합니다. 그리고 캐리지 리턴을 하나의 문자열로 사용하여 파일의 모든 행을 가져옵니다. 한 문자열을 정렬해도 아무 것도 바뀌지 않으므로 동일한 출력을 볼 수 있습니다. 확인합니다 경우 그이의 경우 변경 출력 루프 :

for(std::vector<std::string>::const_iterator i = vWords_TMP.begin(); i != vWords_TMP.end(); ++i) 
    std::cout << "\"" << *i << "\"\n"; 

그리고 당신은 출력에 표시 얼마나 많은 따옴표로 확인한다.

0

문제는 파일의 모든 줄을 하나의 문자열로 읽는 것 같습니다.

BOOST_FOREACH (const std::string& t, tokens) { 
    vWords.push_back(t); 
    std::cout << "pushing token: \"" << t << "\"" << std::endl; 
} 

그리고 당신은 전체 파일 내용이 귀하의 벡터로 밀어받을 것을 알 수 있습니다 : 인쇄 문으로 vWords 건설을 수정 here

#include <iostream> 
#include <string> 
#include <vector> 
#include <algorithm> 
using namespace std; 

int main() { 
    typedef std::vector<std::string> Strings; 
    Strings strings = { "world", "good bye", "hello", "aloha" }; 
    sort(strings.begin(), strings.end()); 
    for (Strings::iterator it = strings.begin(); it != strings.end(); ++it) cout << *it << "\n"; 
    return 0; 
}