2012-05-12 4 views
6

Đối với mã dưới đây, tôi đang nhận được lỗi trong tiêu đề cho dòngLỗi: "không phù hợp cho nhà điều hành +", cho danh sách iterator

while((*(It2 + code)).exists){ 


void locatetohashtable(std::list<Element> elist, 
         int *m,std::list<Element>& table, 
         std::list<std::string>& keylist) 
{   
    std::list<Element>::iterator It2=table.begin(); 
    int i=0; 
    int k=0; 
    std::list<Element>::iterator It; 
    for(It = elist.begin(); It != elist.end(); ++It) 
    { 
     int code=hash_func(stringIntValue((*It).name),*m,i); 
     while((*(It2 + code)).exists){ 
      i++; 
     } 
     table.insert(*(It2+i), (*It)); 
     keylist.insert(keylist.begin(),(*It).name); 
     k++; 
    } 
} 

tôi không nhận được cùng lỗi cho ++It

Vấn đề là gì?

Trả lời

11

An iterator cho một std::list là hai chiều, vì vậy nó không hỗ trợ +(int). Các hoạt động di chuyển được hỗ trợ duy nhất là ++--.

4

std::list trình lặp chỉ là hai chiều, không truy cập ngẫu nhiên, vì vậy bạn không thể sử dụng toán tử + để thăng tiến chúng. Sử dụng std::next (C++ 11) hoặc std::advance để thay thế.

9

Đó là do các trình lặp của std::listbidirectional iterators, vì vậy chúng không hỗ trợ thao tác bổ sung mà bạn đang cố gắng thực hiện. Trong thực tế, điều này là bởi vì nó không thể được thực hiện như một hoạt động hiệu quả, vì các danh sách không cung cấp truy cập ngẫu nhiên, vì vậy bạn phải bước từng bước một từ trình vòng lặp ban đầu đến một đích. Quyết định thiết kế là không cung cấp một hoạt động gì sẽ không hiệu quả.

Bạn có thể sử dụng std::advance hoặc std::next để tránh viết các vòng tăng của riêng mình, nhưng dưới mui xe, nó sẽ tăng từng bước.

2

Đây là vấn đề của "Khái niệm".

A list chỉ có thể được duyệt ngang hiệu quả forward and backward, do đó trình vòng lặp của nó mô hình hóa khái niệm hai chiều Iterator.

Bạn có thể sử dụng std::advance để di chuyển trình vòng lặp bởi nhiều vị trí cùng một lúc, tuy nhiên nó sẽ không hiệu quả.

Hoặc bạn có thể thay đổi để sử dụng vector hoặc deque thay vì danh sách. Vì chúng là các thùng chứa Random Access, các trình vòng lặp của chúng hỗ trợ cộng và trừ hiệu quả.