2013-04-11 29 views
5

Chỉ cần học C++, vì vậy tôi có thể không hiểu chính xác, nhưng tôi chỉ đọc rằng hàm chèn phạm vi trả về một trình lặp theo tiêu chuẩn mới (C++ Primer 5th Ed, cplusplus.com, cppreference.com và các câu trả lời khác nhau đề xuất sử dụng nó để duy trì hiệu lực của trình lặp).Các chức năng chèn vùng chứa của STL trở về void theo C++ 11?

Từ cppreference.com:

template< class InputIt > 
iterator insert(const_iterator pos, InputIt first, InputIt last); 

Tuy nhiên, mỗi phiên bản của Cygwin GCC và MinGW mà tôi đã cố gắng đã trở lại khoảng trống sử dụng -std = C++ 11. Thậm chí nhìn vào các tiêu đề, nó có vẻ như đó là cách nó được viết, và rằng không có gì tôi có thể sửa đổi để sửa chữa điều đó.

Tôi đang thiếu gì?

Đây là chức năng 'kết thúc chương tập thể dục' tôi đã cố gắng viết; thay thế một chuỗi với nhau trong một chuỗi cho trước:

(Tôi hiểu nó sẽ không hoạt động như dự định cách thức mà nó được viết)

void myfun(std::string& str, const std::string& oldStr, const std::string& newStr) 
{ 
    auto cur = str.begin(); 
    while (cur != str.end()) 
    { 
     auto temp = cur; 
     auto oldCur = oldStr.begin(); 
     while (temp != str.end() && *oldCur == *temp) 
     { 
      ++oldCur; 
      ++temp; 
      if (oldCur == oldStr.end()) 
      { 
       cur = str.erase(cur, temp); 
       // Here we go. The problem spot!!! 
       cur = str.insert(cur, newStr.begin(), newStr.end()); 
       break; 
      } 
     } 
     ++cur; 
    } 
} 
+1

nào * phiên bản * của MinGW bạn đang sử dụng? Xin đừng nói * "mọi phiên bản" *. Điều đó không giúp được gì. Hãy cụ thể. – Nawaz

+0

Ah, cảm ơn bạn. Bản dựng mới nhất sử dụng mingw-get-inst-20120426.exe, 4.6.2; i686-w64-mingw32-gcc-dw2-4.8.0-win32_rubenvb; x86_64-w64-mingw32-gcc-4.6.3-2-release-win64_rubenvb; và MinGW-TDM 4.7.1-dw2 – Habnab

+0

Thử. GCC '4.8.0'. Nó là mới nhất! – Nawaz

Trả lời

4

Không có trình biên dịch hỗ trợ đầy đủ C++11 được nêu ra. Các phiên bản sau của gccclang có phần lớn tiêu chuẩn mới được triển khai, nhưng vẫn còn những phần cần được thực hiện. Thật vậy, nhìn vào basic_string.h cho gcc 4.7.0 cho thấy phiên bản này của insert chưa được cập nhật:

template<class _InputIterator> 
    void 
    insert(iterator __p, _InputIterator __beg, _InputIterator __end) { ... } 
+0

Nếu đó không chỉ là những thứ tôi làm hỏng, điều đó giúp giảm bớt sự thất vọng, mặc dù tôi ước rằng tôi có thể tìm thấy một phiên bản được hỗ trợ. Cảm ơn bạn vì sự giúp đỡ! – Habnab

+2

@Habnab: Visual Studio 11 đã triển khai đúng cách. –

+0

@BenjaminLindley: Cảm ơn bạn. Mặc dù, tôi đã cố gắng tránh VS vì lý do nào đó vượt ra ngoài tôi. Cố gắng để dính vào một bộ công cụ tối thiểu như tôi học ngôn ngữ (vim và thực hiện/tup cho đến nay). Tôi có thể cho vào một lúc nào đó. Nhiều đánh giá cao sự giúp đỡ. – Habnab

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