2016-04-18 15 views
3

Ich würde gerne wissen, ob ich ein Array {67,55,65} in einem anderen Array {23,45,67,55,65,66,76,78} finden kann. Ich bin nicht daran interessiert, einzelne Elemente des Arrays zu finden, sondern das Array als Ganzes. Ich habe versucht, einige CodeFinden eines Arrays als Teilstring in ein anderes Array

#include <iostream> 
#include <algorithm> 
#include <array> 

int main() 
{ 
    std::array<int,8> in = {23,45,67,55,65,66,76,78}; 
    std::array<int,3> sstr = {67,55,65}; 
    auto it = std::search(in.begin(), in.end(), 
        std::make_boyer_moore_searcher(
         sstr.begin(), sstr.end())); 
    if(it != in.end()) 
     std::cout << "The string " << sstr << " found at offset " 
        << it - in.begin() << '\n'; 
    else 
     std::cout << "The string " << sstr << " not found\n"; 
} 

Edit: den Grund zu gehen mit make_boyer_moore_searcher ist die Größe meiner Array, etwa zu berechnen, kann etwa 10 Millionen Euro. Ich möchte eine effiziente Suchtechnik.

Ich bin mir nicht sicher, ob mein Code funktionieren soll. Ich habe viele Fehler

bm.cpp:12:20: error: ‘make_boyer_moore_searcher’ is not a member of ‘std’ std::make_boyer_moore_searcher( ^ bm.cpp:15:19: error: cannot bind ‘std::basic_ostream’ lvalue to ‘std::basic_ostream&&’ std::cout << "The string " << re << " found at offset " ^ In file included from /usr/include/c++/4.8/iostream:39:0, from bm.cpp:1: /usr/include/c++/4.8/ostream:602:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits; _Tp = std::array]’ operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x) ^ bm.cpp:18:19: error: cannot bind ‘std::basic_ostream’ lvalue to ‘std::basic_ostream&&’ std::cout << "The string " << re << " not found\n"; ^ In file included from /usr/include/c++/4.8/iostream:39:0, from bm.cpp:1: /usr/include/c++/4.8/ostream:602:5: error: initializing argument 1 of ‘std::basic_ostream<_CharT, _Traits>& std::operator<<(std::basic_ostream<_CharT, _Traits>&&, const _Tp&) [with _CharT = char; _Traits = std::char_traits; _Tp = std::array]’ operator<<(basic_ostream<_CharT, _Traits>&& __os, const _Tp& __x) ^

+2

Haben Sie bei der [Bezugsseite] sehen (http://en.cppreference.com/ w/cpp/experimental/boyer_moore_searcher) dieser Funktion? –

+0

@Bob__ Danke für deinen Kommentar. Ich habe mir die Funktion angeschaut und es gibt ein Beispiel für String Match. Ich bin mir nicht sicher, ob das für eine Array-Übereinstimmung funktioniert. Vielleicht fehlt mir etwas. – AwaitedOne

+1

Sie sollten die richtigen Header einschließen, und diese Funktion gehört zu 'std :: experimental' nicht' std :: '. Außerdem sollten Sie Operator << für Array implementieren oder eine Schleife verwenden, um die Werte auszudrucken;) –

Antwort

3

entfernen make_boyer_moore_searcher und verwenden nur std::search. Test it

#include <iostream> 
#include <algorithm> 
#include <array> 

int main() 
{ 
    std::array<int,8> in = {23,45,67,55,65,66,76,78}; 
    std::array<int,3> sstr = {67,55,65}; 
    auto it = std::search(in.begin(), in.end(), sstr.begin(), sstr.end()); 
    if(it != in.end()) 
     std::cout << "The string found at offset " 
        << it - in.begin() << '\n'; 
    else 
     std::cout << "The string not found\n"; 
} 

bearbeitet:

Als Reaktion auf den Kommentar, es ist auch möglich, eine 2D-Array zu suchen. In std::search Elemente werden unter Verwendung operator== verglichen.

std::array<std::array<int, 3>, 4> in {{ {1,2,3}, {4,5,6}, {7,8,9}, {10,11,12} }}; 
std::array<std::array<int,3>, 1> sstr = {10,11,12}; 
... 

Test it

+0

Wird es in einem zweidimensionalen Array suchen, sagen wir, ich habe 'std :: array , 4> in {{{{1, 2, 3, 4}}, {{5, 67, 55, 65}}, {{9, 10, 11, 12}}}}; ' –

+0

@AaghazHussain yep, siehe das Update – incBrain

4

Wenn Sie make_boyer_moore_searcher verwenden möchten, sollten Sie die richtigen Header enthalten, wie in der reference page erklärt: Also in diesem Fall können Sie es, indem Sie den Code machen arbeiten

#include <experimental/algorithm> 
#include <experimental/functional> 

Dann, als diejenigen, die nicht zu std gehört, sollten Sie sie mit nennen:

auto it = std::experimental::search(in.begin(), in.end(), 
       std::experimental::make_boyer_moore_searcher(
        sstr.begin(), sstr.end())); 

In Ihrem Code versuchen Sie auch, operator<< zu verwenden, um eine-10 int (die Sie Zeichenfolge aufrufen) auszudrucken.

for (int i : sstr) { 
    std::cout << i << ' '; 
} 

Mit Ihren Daten, die Sie erhalten sollen: Sie können es stattdessen überlasten oder eine Schleife verwenden

The string 67 55 65 found at offset 2 
+2

Auch wenn es offensichtlich ist, würde ich erwähnen, dass alle Standard-Bibliotheksimplementierungen nicht alle experimentellen Daten implementieren Erweiterungen. – user2079303

+0

'bm.cpp: 4: 34: fatale Fehler: experimental/Algorithmus: Keine solche Datei oder das Verzeichnis #include ^ Compilation terminated.' – AwaitedOne

+1

@AwaitedOne Wie durch user2079303 vermutet. Verwenden Sie also entweder eine andere Implementierung oder verwenden Sie keine "experimentelle" Funktion. –

Verwandte Themen