C++ 使用C++;
我使用以下代码搜索文件并提供数据和相关行号。但是这段代码在数十万行的情况下足够快吗?我的电脑实际上冻结了几秒钟。我需要搜索一对整数,并在逗号后返回它的RHS值(一些统计数据),但是使用下面的代码我可以返回整行C++ 使用C++;,c++,string,search,C++,String,Search,我使用以下代码搜索文件并提供数据和相关行号。但是这段代码在数十万行的情况下足够快吗?我的电脑实际上冻结了几秒钟。我需要搜索一对整数,并在逗号后返回它的RHS值(一些统计数据),但是使用下面的代码我可以返回整行 使用split函数解析返回的数据并获取我的RHS值在快速性方面是否是个好主意 或 根据LHS参数直接获取RHS值。(嗯,我做不到这一点) 有人能帮我实现以上两个目标中的任何一个吗 这是我的密码: #include <string> #include <iostream&g
split
函数解析返回的数据并获取我的RHS值在快速性方面是否是个好主意#include <string>
#include <iostream>
#include <fstream>
int main()
{
std::ifstream file( "index_hyper.txt" ) ;
std::string search_str = "401" ;
std::string line ;
int line_number = 0 ;
while( std::getline( file, line ) )
{
++line_number ;
if( line.find(search_str) != std::string::npos )
std::cout << "line " << line_number << ": " << line << '\n' ;
}
}
您可以通过以下方式完成上述代码的工作:
grep -n "^401," index_hyper.txt
如果只想输出RHS,可以:
grep "^401," index_hyper.txt | sed "s/[^,]*,//"
如果您在没有sed、grep、bash等的Windows平台上,则可以通过安装轻松访问unix工具。一般来说,不要将字符串拆分为 更小的片段(子字符串),直到您需要。从 具体说明需要什么:您谈到RHS和LHS,以及 谈论“基于LHS参数获取RHS值”。那么:你想要什么 第一个字段上的精确匹配,第二个字段上的子字符串匹配 第一个字段,还是整行上的子字符串匹配 无论如何:一旦你在
line
中有了这一行,你就可以轻松地
将其分为两个字段:
std::string::const_iterator pivot = std::find( line.cbegin(), line.cend(), ',' );
然后,您所做的取决于您的标准:
if ( pivot - line.cbegin() == search_str.size() &&
std::equal( line.cbegin(), pivot, search_str.begin() ) ) {
// Exact match on first field...
std::cout << std::string( std::next( pivot ), line.cend() );
}
if ( std::search( line.cbegin(), pivot, search_str.begin(), search_str.end() ) != pivot ) {
// Matches substring in first field...
std::cout << std::string( std::next( pivot ), line.cend() );
}
if ( std::search( line.cbegin(), line.cend(), search_str.begin(), search_str.end() ) != line.cend() ) {
// Matches substring in complete line...
std::cout << std::string( std::next( pivot ), line.end() ); }
}
if(pivot-line.cbegin()==search\u str.size()&&
std::equal(line.cbegin(),pivot,search_str.begin()){
//第一场比赛完全匹配。。。
std::cout RHS和LHS是什么?你想要什么输入输出?这个文件的代码冻结了你的计算机?我很惊讶。确定不是病毒检查器?RHS是右手边,LHS是…@user2754070啊,它没有那么大,是其他东西导致了问题。看到1.7MB了吗?grep会很快解析那个文件,不需要写一个这与C++
有什么关系?@P0W,不是。这与问题规范有关。为什么不干脆sed-n的://^401,//p'index_hyper.txt
?这可能至少和他能写的任何东西一样快。但据推测,在现实生活中,他希望检测语法错误,并向斯坦输出消息在这种情况下,DARD错误。(否则,为什么有C++,当有这样一个简单的解决方案时?)JamesKanze,谢谢简化。为什么C++不问为什么C++?没有理由,假设它是没有的。“如果你有一个锤子,一切看起来像钉子。”AdBurry:是的。因为他提到了他的“PC”,很可能他在运行Windows。在这种情况下,他可能除了C++没有其他很多东西。(我承认即使在错误检查等情况下,如果我不能用shell工具来做,我也会删除Python脚本。对于这个小东西,编译器没有任何意义。)太棒了!James它的一个值作为输入,关联的RHS作为输出,还有一件事任何/所有的输入值都是唯一的。你能把它放在我的代码中吗?尽管我包含了算法。h
什么样的错误?除了一个明显的打字错误,我遇到的唯一问题是编译器不能实例化std::equals
,因为pivot
是一个const\u迭代器
,但是line.begin()
是非常量的。你可以用几种方法来纠正这个问题:在C++11中,要么使pivot
auto
(因此它将是一个非常量迭代器),要么使用cbegin()
和cend()
在行
上的任何地方,一旦您阅读了它。在C++11之前,最简单的方法是将pivot
声明为非常量迭代器(或者因为您将要使用line.begin()
多次,您可以将其保存在常量迭代器中,并使用该迭代器。我已对答案进行了编辑,以反映必要的修复,以便它(为我)编译并工作。谢谢!我在Linux Env上使用NetBeans IDE,我想std::next
已经包含在iterator.h
中了,但是仍然-无法解析标识符“next”
我有两个错误:错误-1:main。cpp:25:错误:没有匹配的函数调用“equal”(uuu gnu cxx::uu normal_迭代器,uu gnu cxx::u normal_迭代器&,uu gnu cxx::u normal_迭代器)
Error-2:main.cpp:28:Error:'next'不是'std'的成员。
if ( pivot - line.cbegin() == search_str.size() &&
std::equal( line.cbegin(), pivot, search_str.begin() ) ) {
// Exact match on first field...
std::cout << std::string( std::next( pivot ), line.cend() );
}
if ( std::search( line.cbegin(), pivot, search_str.begin(), search_str.end() ) != pivot ) {
// Matches substring in first field...
std::cout << std::string( std::next( pivot ), line.cend() );
}
if ( std::search( line.cbegin(), line.cend(), search_str.begin(), search_str.end() ) != line.cend() ) {
// Matches substring in complete line...
std::cout << std::string( std::next( pivot ), line.end() ); }
}