[英]How to use vectors efficiently?
我在我的代碼中使用向量和向量size_type。
#include <iostream>
#include <vector>
using namespace std;
using std::vector;
typedef vector<int>::size_type size_type;
int main()
{
size_type n;
cin>>n;
vector<int> u(n,0);
for(size_type i = 0; i != n; ++i) {
cin >> u[i];
}
cout << *u.end();
return 0;
}
錯誤是當我輸入n = 5時。 向量請求5個元素,然后輸出0或一些垃圾值。 如何打印最后一個元素?
u.end()
是一個無法解除引用的迭代器(所謂的“通過結束迭代器”)。 使用u.back()
獲取最后一個值。
錯誤在這里:
cout<<*u.end();
end()
迭代器指向一個超過向量結尾的元素。 取消引用它始終是未定義的行為。
如果你有一個end()
迭代器並希望看到最后一個元素,請使用std::prev
,如下所示:
cout << *std::prev(u.end());
u.end()
給出一個指向超出最后一個元素的迭代器; 你必須減少它指向最后一個元素。 你不能取消引用過去 - 結束迭代器; 試圖這樣做會給出不確定的行為。
最后一個元素可用作u.back()
。
因為它已經指出了thiis聲明
cout<<*u.end();
導致打印垃圾值。 成員函數end()返回的迭代器“指向”容器中的最后一個實際元素之后。
它與循環中的相同
for(size_type i=0; i!=n; ++i)
其中n的值從循環中排除。 您可以通過以下方式重寫循環
for ( std::vector<int>::iterator it = u.begin(); it != u.end(); ++it )
實際上u.end()
等於u.begin() + n
如果n不是可接受的索引,則u.begin() + n
不是可以解除引用的迭代器。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.