2013-08-30 47 views
22

Tôi đang cố gắng xây dựng một chương trình sử dụng phần tử thứ hai để cuối cùng trong một vectơ, cho đến nay tôi đã sử dụng: (arr2.rbegin() + 1)Mã cho phần tử thứ hai thành phần tử cuối cùng trong một vector

Nếu tôi sử dụng một toán tử so sánh trong một điều kiện như:

if(arr2.rbegin()+1 == true) 

tôi nhận được một thông báo lỗi: 'no match for operator =='

+0

'arr2.rbegin() + 1' là một iterator, không phải là một giá trị. Hãy thử sử dụng '*': 'if (* (arr2.rbegin() + 1) == true)' – JoshG79

+5

'* (arr2.rbegin() + 1)' hoặc 'arr2 [arr2.size() - 2]' – Dave

+0

@ JoshG79: Trong trường hợp đó, loại bạn nhận được khi dereferencing iterator cần xác định toán tử thích hợp ==. – thokra

Trả lời

3

nhìn vào tài liệu ở đây

http://www.cplusplus.com/reference/vector/vector/?kw=vector

tôi mong đợi bạn truy cập vào các yếu tố của bạn bằng cách

secondToLast = myVector[myVector.size() - 2]; 
+0

Không được trừ 1 thay vì trừ 2, xem các chỉ số bằng 0 như thế nào? – Damon

+3

@ Damon: Không, không nên. Các chỉ số chạy từ '0' đến' size() - 1', với 'size() - 1' là số cuối. Do đó, từ tiếp theo đến cuối là 'size() - 2'. –

1

Bạn có thể thử làm như thế này: -

if(*(arr2.rbegin()+1)) 
0

Nó phụ thuộc vào những gì bạn có ý nghĩa bởi "thứ hai để yếu tố cuối cùng" . Hãy định nghĩa iterator sau ...

vector<int>::iterator it = arr2.end(); 

it--; 
it--; 

Bạn phải decriment iterator hai lần bởi vì khi bạn khai báo các iterator để "điểm" đến cùng, nó thực sự dẫn đến vị trí SAU yếu tố cuối cùng trong vector.

Đừng quên rằng khi bạn muốn giá trị mà trình vòng lặp trỏ đến, bạn phải bỏ qua nó. như vậy ...

cout << *it; 
26

Nhiều câu trả lời và nhận xét có ý tưởng đúng nhưng cú pháp thực sự xấu. Dưới đây là hai cách tốt để thể hiện điều đó.

arr2.end()[-2] // end() is past the last element, -1 for last element, -2 for second-last 
arr2.rbegin()[1] // rbegin() is reverse order starting at 0 for last element, 1 for second-last 

Demo: http://ideone.com/2cZeUq

Nó hoạt động vì RandomAccessIterator, mà vector đã được yêu cầu cung cấp operator[]it[n] tương đương với *(it + n), giống như đối với con trỏ.

Vì vậy, các mã trong câu hỏi của bạn trở thành chỉ

if (arr2.rbegin()[1]) // test penultimate element 
+0

sẽ làm việc này với 'arr2.back() [- 1]'? – Federico

+1

@Federico: không, 'front()' và 'back()' cung cấp tham chiếu, chứ không phải vòng lặp. Số học con trỏ không hoạt động trên tham chiếu. Bạn có thể làm '(& arr2.back()) [- 1]' nhưng điều đó xấu hơn việc sử dụng các trình vòng lặp. –

+0

Cảm ơn bạn đã giải thích! :) – Federico

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