2016-03-24 4 views
-1
#include <iostream> 
#include <string> 
#include <sstream> 
#include <fstream> 
using namespace std; 




       infile.get(array[position]); 
       position++; 
      } 
      array[position - 1] = '\0'; 
      for (int i = 0; array[i] != '\0'; i++) 
      { 
       cout << array[i]; 
      } 

     } 
    } 
    cout << "Displaying Array..." << array << endl; 

    //stringstream buffer; 
    //buffer << in.rdbuf(); 
    //std::string test = buffer.str(); 
    //std::cout << test << std::endl << std::endl; 
    // 

    system("pause"); 
} 

Я пытаюсь создать программу, которая будет искать в текстовом файле, для определенных целей я получил степень бакалавра в Манчестерском университете в 1980-х годах. В моем классе «Parallel Computing» мы читали лекцию о машине Manchester Dataflow Machine - параллельной вычислительной архитектуре, которая собиралась захватить мир.C++ Поиск по индексу

Я получил степень магистра в Университете Вашингтона в 2000-х годах. В моем классе «Parallel Computing» мы прочитали лекцию о машине Manchester Dataflow и почему ее не приняли во всем мире. *

Через 20 лет нам кажется, что у нас появилось много идей для параллельных вычислений , не нападая ни на одну идею, которая связывает все вместе. Для последовательных вычислений у нас есть архитектура фон Неймана, и даже если у нас теперь есть кэши и предсказания ветвей, а также конвейерная обработка и многое другое, мы все еще можем рассматривать базовую машину как машину фон Неймана.

Самый практичный подход, который я видел, - использование шаблонов параллельного программирования. В зависимости от того, с кем вы говорите, и как они группируют шаблоны, есть где-то между 13 и 20 из них. Я не согласен с объяснением д-ром Майклом МакКолом шаблонов: мне удалось связать текстовый файл, но я не уверен, каким последующим шагом будет создание кода для поиска файлов, для определенных слов. Любая помощь будет большой.

Я думал о возможно, возможно, создании массива, а затем прохождение каждого элемента, но не уверен. Любая помощь будет действительно полезна. e расположение в массиве.

Спасибо

+2

Пожалуйста, используйте stream.eof() правильно - избежать - поиск в Интернете –

+0

Это 'в то время как (infile.eof())' неправильно, он никогда не будет начать , если файл содержит что-то. – DimChtz

+0

@DimChtz не могли бы вы дать некоторые, как исправить это –

ответ

1

Есть множество алгоритмов там, как Кнута Морриса Пратта или Рабина-Карпа, например. Я думаю, что википедия прекрасно описывает их. Но они обычно хороши для 1 строки. Для нескольких строк лучшим алгоритмом является построение дерева суффиксов из текста и поиск по дереву.

0

Самый простой способ - использовать стандартную библиотеку. В настоящее время поисковые запросы являются линейными, но, как и в случае с ++ 17, библиотека обеспечивает легкую параллелизацию, если производительность является ключевой.

Вот решение, которое использует только стандартную библиотеку (требуется C++ 11).

Обратите внимание на правильный способ считывания строк из потока.

#include <iostream> 
#include <string> 
#include <vector> 
#include <map> 
#include <sstream> 
#include <algorithm> 
#include <iomanip> 

using search_term_vector = std::vector<std::string>; 
using search_results = std::map<std::string, std::vector<std::size_t>>; 

std::vector<std::string> load_search_terms() 
{ 
    constexpr char search_term_file[] = "pig dog cat garbage"; 
    std::istringstream is(search_term_file); 

    std::vector<std::string> search_terms; 
    std::string term_buffer; 
    while (is >> term_buffer) { 
     search_terms.push_back(std::move(term_buffer)); 
    } 
    return search_terms; 
} 

search_results search_space_for_terms(const std::string& search_space, const search_term_vector& terms) 
{ 
    search_results results; 

    for (auto const& term : terms) 
    { 
     auto& result = results[term]; 
     auto icurrent = std::begin(search_space); 
     while (icurrent != std::end(search_space)) 
     { 
      auto ipos = std::search(icurrent, std::end(search_space), 
            std::begin(term), std::end(term)); 
      if (ipos != std::end(search_space)) 
      { 
       result.push_back(std::distance(std::begin(search_space), ipos)); 
       std::advance(ipos, term.length()); 
      } 
      icurrent = ipos; 
     } 
    } 

    return results; 
} 

int main() 
{ 
    using namespace std::string_literals; 

    auto search_space = "tdogicatzhpigu"s; 
    auto search_terms = load_search_terms(); 
    auto results = search_space_for_terms(search_space, search_terms); 

    for (auto const& result_pair : results) 
    { 
     std::cout << std::quoted(result_pair.first) << " was found "; 
     auto const& locations = result_pair.second; 
     if (locations.empty()) 
     { 
      std::cout << "nowhere" << std::endl; 
     } 
     else 
     { 
      auto sep = (locations.size() > 1) ? "at positions " : "at position "; 
      for (auto pos : locations) 
      { 
       std::cout << sep << pos; 
       sep = ", "; 
      } 
      std::cout << std::endl; 
     } 
    } 

    return 0; 
} 

Ожидаемые результаты:

"cat" was found at position 5 
"dog" was found at position 1 
"garbage" was found nowhere 
"pig" was found at position 10 
Смежные вопросы