2010-06-29 39 views
13

Tôi đã có chức năng này:'std :: vector <T> :: iterator it;' không biên dịch

template<typename T> 
    void Inventory::insertItem(std::vector<T>& v, const T& x) 
    { 
     std::vector<T>::iterator it; // doesn't compile 
     for(it=v.begin(); it<v.end(); ++it) 
     { 
      if(x <= *it) // if the insertee is alphabetically less than this index 
      { 
       v.insert(it, x); 
      } 
     } 
    } 

và g ++ cung cấp cho các lỗi này:

src/Item.hpp: In member function ‘void 
yarl::item::Inventory::insertItem(std::vector<T, std::allocator<_CharT> >&, const T&)’: 
src/Item.hpp:186: error: expected ‘;’ before ‘it’ 
src/Item.hpp:187: error: ‘it’ was not declared in this scope 

nó phải là một cái gì đó đơn giản, nhưng sau mười phút nhìn chằm chằm vào nó, tôi có thể' t tìm thấy bất cứ điều gì sai trái. Bất cứ ai khác nhìn thấy nó?

+2

btw, bạn không nên sử dụng 'it

Trả lời

28

Hãy thử điều này thay vì:

typename std::vector<T>::iterator it; 

Dưới đây là một trang mô tả how to use typename và tại sao nó là cần thiết ở đây.

+0

Điều đó đã làm được điều đó. Cảm ơn. – Max

+0

+1 để có câu trả lời ngắn gọn và liên kết cho giải thích chi tiết. – stinky472

8

Những gì bạn đang làm không hiệu quả. Sử dụng tìm kiếm nhị phân thay thế:

#include <algorithm> 

template <typename T> 
void insertItem(std::vector<T>& v, const T& x) 
{ 
    v.insert(std::upper_bound(v.begin(), v.end(), x), x); 
} 
+2

+1 - đánh bại tôi. Có lẽ cũng đáng nói đến vì mã hiện tại không thoát khỏi vòng lặp sau khi thực hiện chèn, nó thường sẽ chèn thêm các bản sao của mục mới mà chúng không mong muốn. –

+2

@Jerry: Thậm chí tệ hơn, nếu kích thước của vector bằng với dung lượng của nó, 'chèn' sẽ làm mất hiệu lực tất cả các trình vòng lặp thu được trước khi chèn, vì vậy' ++ nó' sẽ dẫn thẳng vào vùng hành vi không xác định. – fredoverflow

+1

+1 (nhưng ước gì tôi có thể cho +10). Nhìn vào mã lần thứ hai, lỗi xây dựng là một vấn đề nhỏ so với hành vi thời gian chạy của mã. – stinky472

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