2013-11-10 62 views
1

排序我有以下代码:的std ::排序没有一个std元素::矢量<std::string>

#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'; 
} 

然而,当我运行的std ::排序没有排序的载体。我输入以下文件:

> FILE 
UUUUUUUUUUUUUUUUUUUUU 
AAAAAAAAAAAAAAAAAAAAA 
KKKKKKKKKKKKKKKKKKKKK 
BBBBBBBBBBBBBBBBBBBBB 
YYYYYYYYYYYYYYYYYYYYY 

应该变成:

AAAAAAAAAAAAAAAAAAAAA 
BBBBBBBBBBBBBBBBBBBBB 
KKKKKKKKKKKKKKKKKKKKK 
UUUUUUUUUUUUUUUUUUUUU 
YYYYYYYYYYYYYYYYYYYYY 

但不幸的是输出排序后相同。有任何想法吗?

+3

很多发布的代码与问题无关,删除不仅可以帮助人们阅读您的问题,还可以帮助您自己解决问题 – aaronman

+0

您传递给程序的命令行,特别是分隔符是什么?你有没有仔细检查矢量中的字符串是否有任何流浪的不可打印字符?用'getline'读取你的输入,并按照预期进行排序。 –

回答

1

与打印语句修改您的vWords建设:

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

,你会发现,整个文件内容将被推入到您的载体作为单个字符串。显然,排序单个元素不会改变任何东西。

取决于您决定应该发生什么。

我假设你的意思是你想让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 

(请注意,你的程序工作,因为我认为你想让它)

作为命令行参数传递换行符的方式是,我有一个开头"然后回车键,然后关闭"并再次输入以运行该命令。

+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

问题似乎是,您正在将文件的所有行读取到一个字符串中。实际的排序算法本身的工作原理,这表现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; 
} 
相关问题