【问题标题】:Converting from sub_match<const char *>' to 'const char *const &'从 sub_match<const char *>' 转换为 'const char *const &'
【发布时间】:2017-03-25 14:54:21
【问题描述】:

我正在尝试将 std::match_results 数据映射到我的 std::multimap 变量。代码如下:

#include "Precompiled.h"

using namespace std;
using namespace tdd;

auto main() -> int
{
    auto filename = LR"(E:\stats.stats)";

    auto file = invalid_handle
    {
        CreateFile(
            filename,
            GENERIC_READ,
            FILE_SHARE_READ,
            nullptr,
            OPEN_EXISTING,
            FILE_ATTRIBUTE_NORMAL,
            nullptr
        )
    };

    if (!file)
    {
        TRACE(L"CreateFile failed %d\n", GetLastError());
        return 0;
    }

    auto size = LARGE_INTEGER{};

    if (!GetFileSizeEx(file.get(), &size))
    {
        TRACE(L"GetFileSizeEx failed %d\n", GetLastError());
        return 0;
    }

    if (size.QuadPart == 0)
    {
        TRACE(L"File is empty\n");
        return 0;
    }

    auto map = null_handle
    {
        CreateFileMapping(file.get(),
        nullptr,
        PAGE_READONLY,
        0, 0,
        nullptr)
    };

    if (!map)
    {
        TRACE(L"CreateFileMapping failed %d\n", GetLastError());
        return 0;
    }

    auto view = unique_ptr<char, map_view_deleter>
    {
        static_cast<char *>(MapViewOfFile(map.get(),
        FILE_MAP_READ,
        0,0,
        0))
    };

    if (!view)
    {
        TRACE(L"MapViewOfFile failed %d\n", GetLastError());
        return 0;
    }

    auto r = regex{ "type:([IPB])\\sdur:(\\d{1})\\scpbdur:(\\d{1})\\sq:(\\d+\\.\\d+)\\saq:(\\d+\\.\\d+)\\stex:(\\d+)\\smv:(\\d+)\\smisc:(\\d+)\\simb:(\\d+)\\spmb:(\\d+)\\ssmb:(\\d+)" };

    auto begin = view.get();
    auto end = begin + size.QuadPart;

    auto logValues = multimap<char, double>{};

    auto i = cregex_iterator{ begin, end, r };

    int d = 0;

    for (i; i != cregex_iterator{}; ++i, ++d)
    {
        logValues.emplace((*i)[1], (*i)[4]);
    }

    TRACE(L"%d\n", d);

    return 0;
}

我收到以下错误:

无法将参数 1 从 'const std::sub_match' 转换为 'const char *const &'

我尝试了 static_cast 但它不起作用。我是否需要将转换运算符写入 std::sub_match 以将第一个值转换为 char 或者我缺少什么?

另外,在我的第二个 for 循环中,我想通过 i ,它是 std::cregex 迭代器,因为它在填充数据时已递增,我如何重置它以再次通过它?还是自动完成?我在文档中找不到这个问题的答案。

【问题讨论】:

  • 正则表达式在哪里?为什么不直接使用 match_result 和 regex_search() 呢?
  • @sln 很抱歉,我将用整个代码更新我的原始帖子。我没有使用 regex_search() 因为据我了解它只在第一次找到时返回匹配的字符串,并且我需要迭代器来遍历大量文本并获取多个匹配的数据。
  • 我不想告诉你,所有迭代器的核心都使用 regex_search。典型的迭代是while( regex_search(start, end, ...) ) { something something; start = _M[0].second;, etc ... }
  • @sln 很高兴知道,谢谢。但这并没有解决我的问题,因为我的搜索工作也很好,我得到了想要的结果,我只是对如何将 regex_search 返回的数据获取到我的 std::multimap 变量感兴趣。无论我是否使用迭代器,都会使用 regex_search 并将结果存储到类型为 std::sub_match 的 _M 中,就像我的搜索给出的结果一样。

标签: c++ regex c++11


【解决方案1】:

您尚未完成对匹配项的取消引用。 (*i)[1] 返回一个 const sub_match&lt;BidirectionalIterator&gt; &amp; 对象(您的开始/结束迭代器的类型在 BidirectionalIterator 中放置)。此 sub_match 对象包含一对迭代器,它们引用源字符串中的第一个字符和最后一个字符以进行匹配。

要获得该值的字符,您需要执行*(*i)[1].first 之类的操作。

对于您所展示的内容,您不需要第一个循环来计算匹配数。如果您的实际代码更复杂,并且您确实需要运行两次循环,请在通过第一个循环运行之前复制迭代器。

【讨论】:

  • 第一个结果 (*i)[1] 无论如何都是由 cregex_iterator 搜索返回的字符,所以我不需要添加 .first。无论如何我都试过了,得到了同样的错误信息。它有点复杂,我不想把整个源文件放在我原来的帖子中,因为它太多了。第一个循环是通过 5MB+ 的文本文件,所以有很多迭代正在进行。我的原始来源中有一个流程,我意识到我根本不需要第二个循环。所以我的问题只剩下第一部分了。
  • 没关系,我有时候很傻,你说的完全正确!
猜你喜欢
  • 1970-01-01
  • 2018-11-16
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-08-05
相关资源
最近更新 更多