簡體   English   中英

如何有效地使用向量?

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM