2010-11-22 73 views
6

tôi có một mã như thế này ....Làm cách nào để tìm kiếm phần tử trong vectơ?

std::vector<string>::iterator p; 
p = find(v.begin(),v.end(),"asdasda"); 
cout << *p << endl; 

nếu "asdasda" không phải là một phần của vector, p điểm đối với một số rác và cout đưa ra một lỗi seg. câu lệnh if sẽ làm cho cout thực hiện lệnh ifif "asdasda" là gì? và cũng là vị trí của "asdasda" trong v .. như thể chúng tôi đã tuyên bố trước đó v [3] là "asdasda", thì làm cách nào tôi có thể biết được rằng v [3] là "asdasda"?

Trả lời

12

p không trỏ đến "rác", nó chỉ đơn giản là trở thành v.end() khi nội dung không được tìm thấy.

if (p != v.end()) { 
    std::cout << "v[" << (p - v.begin()) << "] = "; 
    std::cout << *p << std::endl; 
} 
+0

cách tìm vị trí của "asdasda" trong v .. như thể chúng tôi đã tuyên bố trước đó v [3] là "asdasda", thì làm cách nào tôi có thể biết được rằng v [3] là "asdasda"? –

+0

@Prasanth: Xem dòng thứ 2 của mã của tôi. – kennytm

+0

@ kenny: cảm ơn .... v.begin() ..: P –

4

Nếu std::find không tìm thấy gì, trình lặp được đặt thành v.end() trong trường hợp này.

if (p != v.end()) 
{ 
    // iterator is good 
} 

Cũng lưu ý trường hợp chung là std::find.

Dưới đây là một định nghĩa đặc trưng của nó:

namespace std { 
    template <class InputIterator, class T> 
    InputIterator find(InputIterator start, 
        InputIterator finish, 
        const T& value); 
} 

Trong trường hợp std::find thất bại, nó sẽ trả lại finish iterator vì tìm kiếm là [start, finish) và bao gồm start nhưng không bao gồm finish.

1

Tìm trả về trình kết thúc vòng lặp nếu nó không tìm thấy giá trị bạn tìm kiếm. Bạn có thể tránh lỗi của mình bằng cách thêm if (p != v.end()) ngay trước dòng hiển thị.

+0

cách tìm vị trí của "asdasda" trong v .. như thể chúng tôi đã khai báo trước đó v [ 3] là "asdasda", sau đó làm thế nào tôi có thể biết từ việc tìm thấy v [3] là "asdasda"? –

+0

'p - v.start()', nếu 'p! = V.end()'. – Flinsch

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