- Java 双重比较
- java - 比较器与 Apache BeanComparator
- Objective-C 完成 block 导致额外的方法调用?
- database - RESTful URI 是否应该公开数据库主键?
我正在尝试将 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;
}
我收到以下错误:
cannot convert argument 1 from 'const std::sub_match' to 'const char *const &'
我试过 static_cast 但它不起作用。我是否需要将转换运算符写入 std::sub_match 以将第一个值转换为 char 还是我遗漏了什么?
此外,在我的第二个 for 循环中,我想遍历 i,它是 std::cregex 迭代器,因为它在填充数据时已经递增,我如何重置它以再次遍历它?还是自动完成?我在文档中找不到这个问题的答案。
最佳答案
您尚未完成对匹配项的取消引用。 (*i)[1]
返回 const sub_match<BidirectionalIterator> &
对象(开始/结束迭代器的类型代替 BidirectionalIterator
)。此 sub_match 对象包含一对迭代器,它们引用该匹配项的源字符串中的第一个字符和最后一个字符。
要获得该值的字符,您需要执行类似 *(*i)[1].first
的操作.
对于您所展示的内容,您不需要第一个循环来计算匹配项的数量。如果您的实际代码更复杂,并且您确实需要运行两次循环,请在运行第一个循环之前复制迭代器。
关于c++ - 从 sub_match<const char * >' to ' const char *const &' 转换,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43017859/
我正在使用 Boost Regex。我有以下代码(简化): bool search_for_match(const string& data) { boost::smatch results;
我将 std::sub_match 作为参数传递给 std::thread(请参阅下面的示例代码)。线程函数需要一个 const 字符串引用。 sub_match 可以转换为字符串。所以一切都可以正常
我正在阅读 std::sub_match 的文档并看到它公开继承自 std::pair .自sub_match只是一对迭代器变成了一个字符序列,加上一些额外的功能,我可以理解它是用一个pair实现的,
我想使用空白字符作为分隔符来标记 std::string,但是在一对引号之间不应考虑分隔符,也不允许使用其他引号。为此,我使用以下 regex (表示为原始字符串文字): R"((\"[^\"]*\"
我正在尝试将 std::match_results 数据映射到我的 std::multimap 变量。这是代码: #include "Precompiled.h" using namespace st
我是一名优秀的程序员,十分优秀!