2016-02-02 15 views
9

Mã của tôi là nghĩa vụ phải đọc trong một tập tin văn bản và có nhiều chủ đề xem xét thông qua các phần khác nhau của dòng cho palindrome dài nhất. Kích thước của đoạn (bao nhiêu dòng) được xác định bởi một số biến chủ đề được truyền vào như một đối số. Tệp văn bản gốc được lưu trữ trong một std :: vector trong đó mỗi chỉ mục của vectơ tương ứng với tệp gốc.basic_string :: _ M_construct null không hợp lệ sau khi xây dựng subvector của các chuỗi

Khi tôi chuyển đoạn con của thư mục con để tìm PayPal(), tôi nhận được 'C++ basic_string :: _ M_construct null không hợp lệ' và tôi không thể hiểu tại sao. Không có chuỗi nào của tôi phải là NULL.

Khi tôi vượt qua các dòng vectơ ban đầu, tôi không nhận được lỗi nào vì vậy tôi giả định rằng nó phải liên quan đến cách tôi tạo trình con.

Dưới đây là mã của tôi:

Result longestPalindrome(std::string str) 
{ 

    int maxLength = 1; // The result (length of LPS) 
    int start = 0; 
    int len = str.size(); 
    int low, high; 

    // One by one consider every character as center point of 
    // even and length palindromes 
    for (int i = 1; i < len; ++i) 
    { 
     // Find the longest even length palindrome with center points 
     // as i-1 and i. 
     low = i - 1; 
     high = i; 
     while (low >= 0 && high < len && str[low] == str[high]) 
     { 
      if (high - low + 1 > maxLength) 
      { 
       start = low; 
       maxLength = high - low + 1; 
      } 
      --low; 
      ++high; 
     } 

     // Find the longest odd length palindrome with center 
     // point as i 
     low = i - 1; 
     high = i + 1; 
     while (low >= 0 && high < len && str[low] == str[high]) 
     { 
      if (high - low + 1 > maxLength) 
      { 
       start = low; 
       maxLength = high - low + 1; 
      } 
      --low; 
      ++high; 
     } 
    } 
    Result result = {0, 0, 0}; 
    return result; 
} 

void findPalindome(std::vector<std::string> chunk, Result& result) 
{ 
    Result localLargest = {0,0,0}; 
    for (unsigned int i = 0; i < chunk.size(); i++) 
    { 
     Result loopLargest = longestPalindrome(chunk[i]); 
     if (localLargest < loopLargest) 
     { 
      localLargest = loopLargest; 
     } 
    } 
    result = localLargest; 
} 

Result 
FindPalindromeStatic(Lines const& lines, int numThreads) 
{ 
    std::vector<Result> results(numThreads, {0,0,0});; 
    int chunkSize = lines.size()/numThreads; //lines is the original vector with all the lines in the file 
    std::vector<std::thread> threads; 
    int counter = 0; 
    for (int i = 0; i < numThreads; i++) 
    { 
     std::vector<std::string>::const_iterator begin = lines.begin() + counter; 
     std::vector<std::string>::const_iterator end = lines.begin() + ((i + 1) * chunkSize); 
     std::vector<std::string> chunk(begin, end); 
     threads.emplace_back(&findPalindome, std::ref(chunk), std::ref(results[i])); 
     counter = ((i+1)*chunkSize); 
    } 
    for (int i = 0; i < numThreads; i++) 
    { 
     threads[i].join(); 
    } 
    Result x = {0,0,0}; 
    return x; 
} 

Bất kỳ trợ giúp sẽ được đánh giá cao và đây là chồng đầu tiên của tôi câu hỏi rất xin lỗi vì bất kỳ sai lầm.

Trả lời

10

Vector chunk không còn tồn tại ở cuối thân vòng lặp for. Nó vẫn được tham chiếu bởi một số chủ đề. Đó được gọi là tham chiếu lơ lửng và nó rất không tốt.

Lỗi mà bạn thấy có thể liên quan đến Result. Bạn không cung cấp định nghĩa của nó (hoặc, bạn đã không cung cấp nó tại thời điểm viết câu trả lời này) vì vậy rất khó để nói. Hãy nhớ rằng bạn là người hỏi mã sai, có thể không đủ điều kiện để quyết định điều gì quan trọng hoặc không hiển thị: nếu bạn biết, thì bạn có thể biết điều gì sai.

+0

Cảm ơn bạn rất nhiều! Điều đó là vậy đó! – schwingms

+0

Bạn được chào đón. Cách giải quyết đơn giản là có một vectơ các vectơ chunk được khai báo trước vòng lặp. –

Các vấn đề liên quan