簡體   English   中英

std :: sort無法對std :: vector的元素進行排序<std::string>

[英]std::sort fails to sort elements of a std::vector<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 :: sort無法對向量進行排序。 我輸入以下文件:

> FILE
UUUUUUUUUUUUUUUUUUUUU
AAAAAAAAAAAAAAAAAAAAA
KKKKKKKKKKKKKKKKKKKKK
BBBBBBBBBBBBBBBBBBBBB
YYYYYYYYYYYYYYYYYYYYY

應該變成:

AAAAAAAAAAAAAAAAAAAAA
BBBBBBBBBBBBBBBBBBBBB
KKKKKKKKKKKKKKKKKKKKK
UUUUUUUUUUUUUUUUUUUUU
YYYYYYYYYYYYYYYYYYYYY

但不幸的是,排序后的輸出是相同的。 有任何想法嗎?

使用打印語句修改您的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

(請注意,您的程序按我認為的方式運行)

我將換行符作為命令行參數傳遞的方式是,先打開"然后輸入Enter鍵,然后關閉" ,然后再次輸入以運行命令。

我看不到將回車符作為分隔符傳遞到程序中的方式,因此您傳遞了其他內容。 然后,您從文件中獲取所有行,並用回車符作為一個字符串。 排序一個字符串不會改變任何內容,因此您將看到相同的輸出。 查看是否將大小寫更改輸出循環為此:

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

並檢查您在輸出中看到多少個雙引號。

問題似乎是您正在將文件的所有行讀入一個字符串。 實際的排序算法本身的工作原理,這表現在這里

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM