线路词典有点像捕获量的文件
Linewise lexicographic sort of a file with a catch
尽管我对这个问题的标题不满意,这可能是一个奇怪的问题;请忍受我。
所以我有文本文件,内容如下:
& AAABBAB
this
& AAAAAAB
is
& BCAAAA
an
& BBBBBA
example
& BABABAB
text
其他所有行以标识符('&')开头的地方。使用上述标识符的行应在词典上进行分类,但是我需要以某种方式将下一行拖到带有输出文件中的新位置。
这是我希望成为输出文件的内容。
& AAAAAAB
is
& AAABBAB
this
& BABABAB
text
& BBBBBA
example
& BCAAAA
an
这样,我可以逐条获得文件内容:
#include <iostream>
#include <fstream>
#include <string>
#include <algorithm>
using namespace std;
int main()
{
ifstream is("test.txt");
string str;
while(getline(is, str))
{
cout<<str<<endl;
}
return 0;
}
有一种简单的方法来完成我想要的东西吗?感谢您的帮助!
我在阅读时会把它们捆在一起,使它们易于排序:
vector<pair<string, string>> vec; // first is identifier
vec.reserve(1000);
bool first = true;
while(getline(is, str))
{
if (first)
vec.emplace_back(str, string());
else
vec.back().second = str;
first = !first;
}
sort(vec.begin(), vec.end());
您可以通过成对收集线条进入std::pair<std::string, std::string>
的向量:
using line_t = std::pair<std::string, std::string>;
std::vector<line_t> lines;
line_t pair_line;
while (std::getline(is, pair_line.first) &&
std::getline(is, pair_line.second)) {
lines.push_back(pair_line);
}
并通过其.first
:
std::sort(begin(lines), end(lines),
[](auto const &l1, auto const &l2)
{ return l1.first < l2.first; });
demo
是的,有。
将整个文件视为键和值对的地图,读取到std::map<std::string,std::string>
中,然后输出地图。由于默认情况下的字符串比较是词典图,并且地图已订购密钥,因此地图将为您进行分类。
如果您的文件太大而无法适合内存,或者通常需要效率。
它结合了
- 记忆地图¹
- 字符串视图
- 标准算法
活在coliru
#include <boost/iostreams/device/mapped_file.hpp>
#include <boost/utility/string_view.hpp>
#include <deque>
namespace io = boost::iostreams;
using boost::string_view;
auto map_entries(string_view input) {
std::deque<string_view> pairs;
while (!input.empty()) {
size_t pos = input.find('n');
if (pos != string_view::npos)
pos = input.find('n', pos + 1);
if (pos != string_view::npos)
pairs.push_back(input.substr(0, pos));
input.remove_prefix(pos + 1); // safe with unsigned wrap around
}
return pairs;
}
#include <iostream>
int main() {
io::mapped_file_source file("input.txt");
auto data = map_entries({ file.data(), file.size() });
std::stable_sort(data.begin(), data.end());
for (auto entry : data)
std::cout << entry << "n";
}
打印
& AAAAAAB
is
& AAABBAB
this
& BABABAB
text
& BBBBBA
example
& BCAAAA
an
使用Posix Mmap而不是在那里的提升物
是微不足道的
²如果您的编译器/库最近足够
std::[experimental::]string_view
相关文章:
- .cpp和.h文件中的模板专用化声明
- 为什么两个不同的未命名名称空间可以共存于一个cpp文件中
- 文本文件中的单词链表
- CMake-按正确顺序将项目与C运行时对象文件链接
- 使用新行和不使用新行读取文件
- 在C++程序中输入的文本文件将不起作用,除非文本被复制和粘贴
- 挂起和取消挂起一个文件DLL
- 如何确定我已使用非编码文件到达 EOF?
- 命名空间中具有.h和.cpp文件的类
- 如何使用ndk-build.cmd构建Android.so文件
- 从包含m行的文件中提取n行,必要时(惰性地)重复该文件
- 读取文件并输入到矢量中
- 在C++中查找文件
- c++库的公共头文件中应该包含什么
- 用c++从输入文件中读取另一行
- Cppcheck生成xml转储文件
- 读取文件的最后一行并输入到链接列表时出错
- 无法编译 rtmidi 测试 cmidiin.cpp 文件, 非法指令
- 如何将内容数组写入文本文件?
- 线路词典有点像捕获量的文件