亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

在std :: vector上進行迭代:無符號vs有符號索引變量

在std :: vector上進行迭代:無符號vs有符號索引變量

C++
寶慕林4294392 2019-11-04 14:28:47
在C ++中迭代向量的正確方法是什么?考慮下面的兩個代碼片段,這一段效果很好:for (unsigned i=0; i < polygon.size(); i++) {    sum += polygon[i];}還有這個:for (int i=0; i < polygon.size(); i++) {    sum += polygon[i];}產生warning: comparison between signed and unsigned integer expressions。我是C ++世界的新手,所以unsigned變量對我來說有點嚇人,我知道unsigned如果使用不正確,變量可能很危險,所以-這是正確的嗎?
查看完整描述

3 回答

?
阿波羅的戰車

TA貢獻1862條經驗 獲得超6個贊

向后迭代

看到這個答案。


迭代轉發

這幾乎是相同的。只需按增量更改迭代器/交換遞減量即可。您應該更喜歡迭代器。有人告訴您將其std::size_t用作索引變量類型。但是,這不是便攜式的。始終使用size_type容器的typedef(雖然在向前迭代的情況下只能進行一次轉換,但是在使用時std::size_t,如果向后迭代的情況下它可能會出錯,以防萬一std::size_t大于typedef的情況size_type) :


使用std :: vector

使用迭代器

for(std::vector<T>::iterator it = v.begin(); it != v.end(); ++it) {

    /* std::cout << *it; ... */

}

重要的是,對于您不知道其定義的迭代器,請始終使用前綴增量形式。這將確保您的代碼盡可能地通用。


使用范圍C ++ 11

for(auto const& value: a) {

     /* std::cout << value; ... */

使用索引

for(std::vector<int>::size_type i = 0; i != v.size(); i++) {

    /* std::cout << v[i]; ... */

}

使用數組

使用迭代器

for(element_type* it = a; it != (a + (sizeof a / sizeof *a)); it++) {

    /* std::cout << *it; ... */

}

使用范圍C ++ 11

for(auto const& value: a) {

     /* std::cout << value; ... */

使用索引

for(std::size_t i = 0; i != (sizeof a / sizeof *a); i++) {

    /* std::cout << a[i]; ... */

}

但是,請閱讀向后迭代的答案,該sizeof方法可以解決什么問題。


查看完整回答
反對 回復 2019-11-04
?
largeQ

TA貢獻2039條經驗 獲得超8個贊

在您的示例的特定情況下,我將使用STL算法來完成此操作。


#include <numeric> 


sum = std::accumulate( polygon.begin(), polygon.end(), 0 );

對于更一般但仍然非常簡單的情況,我將使用:


#include <boost/lambda/lambda.hpp>

#include <boost/lambda/bind.hpp>


using namespace boost::lambda;

std::for_each( polygon.begin(), polygon.end(), sum += _1 );


查看完整回答
反對 回復 2019-11-04
  • 3 回答
  • 0 關注
  • 795 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號