Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ 使用C++;_C++_String_Search - Fatal编程技术网

C++ 使用C++;

C++ 使用C++;,c++,string,search,C++,String,Search,我使用以下代码搜索文件并提供数据和相关行号。但是这段代码在数十万行的情况下足够快吗?我的电脑实际上冻结了几秒钟。我需要搜索一对整数,并在逗号后返回它的RHS值(一些统计数据),但是使用下面的代码我可以返回整行 使用split函数解析返回的数据并获取我的RHS值在快速性方面是否是个好主意 或 根据LHS参数直接获取RHS值。(嗯,我做不到这一点) 有人能帮我实现以上两个目标中的任何一个吗 这是我的密码: #include <string> #include <iostream&g

我使用以下代码搜索文件并提供数据和相关行号。但是这段代码在数十万行的情况下足够快吗?我的电脑实际上冻结了几秒钟。我需要搜索一对整数,并在逗号后返回它的RHS值(一些统计数据),但是使用下面的代码我可以返回整行

  • 使用
    split
    函数解析返回的数据并获取我的RHS值在快速性方面是否是个好主意
  • 根据LHS参数直接获取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() ); }
    }