线路词典有点像捕获量的文件

Linewise lexicographic sort of a file with a catch

本文关键字:捕获量 文件 线路      更新时间:2023-10-16

尽管我对这个问题的标题不满意,这可能是一个奇怪的问题;请忍受我。

所以我有文本文件,内容如下:

 & 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