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
但不幸的是,排序后的输出是相同的。有什么想法吗?
使用 print 语句修改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;
}
相关文章:
- 使用std::transform将一个范围的元素添加到另一个范围中
- 有没有办法将谓词中的元素偏移量传递给 std 算法?
- 我想访问std::unique_ptr中的一个特定元素
- 如何从存储在std::映射中的std::集中删除元素
- 缓存std::数组的选定元素,并在c++中自动保持其一致性
- 从嵌套在std::映射中的std::列表中删除元素的最佳方式
- 使用运算符 [] 引用 std::vector 上最后一个元素时出现问题<>
- 对的排序向量 (std::vector<pair<int, int>>) 按对的第一个元素搜索并更新第二个元素值
- 为什么在 std::map 上移动无法将元素从一个映射移动到另一个映射
- 如何为 std::vector 分配内存,然后稍后为某些元素调用构造函数?
- std::矢量保存 只推送最后一个元素
- std::map:当元素不可默认构造时创建/替换元素
- 如何读/写或遍历 std::array 中的特定元素范围?
- C++如何乘以包含 std::variant 元素的向量的迭代器?正在执行迭代器类型的转换?
- 为什么 std::p air 的大小与其元素的大小之和不同?
- 我可以列表初始化 std::vector 并完美转发元素吗?
- 使用 std::min_element、std::max_element 查找矢量中的最小和最大元素
- 是否有一个 std::set 函数来确定不超过数字 x 的最大元素?
- 除了 std::vector 之外,是否有一个 std 容器不会复制和销毁作为类的元素?
- call call cons构件功能的std ::元素的每个元素