討論區快速選單
知識庫快速選單
討論區最近新進100則主題 掌握Salesforce雲端管理秘訣
[ 回上頁 ] [ 討論區發言規則 ]
C++ STL size_t 的轉換
更改我的閱讀文章字型大小
作者 : cjchen_tw(cjchen_tw)
[ 貼文 14 | 人氣 6707 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/15 下午 01:01:23
假設如下C++程式:

vector v;
int count = 0;
for (int i = 0; i < v.size(); i++) {
    .....
    count = count + i;
}

Compile時通常會產生warning. 因為v.size()會傳回 size_t的型別, 和int型別不同.
有人說 size_t 是 unsigned int. 小弟試過 unsigned int, unsigned long. 看樣子都有些問題.

請問應該怎麼 cast size_t 型別到 int呢?
作者 : bensontan(Benson) 貼文超過1000則人氣指數超過30000點
[ 貼文 1056 | 人氣 40462 | 評價 3290 | 評價/貼文 3.12 | 送出評價 80 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/15 下午 01:40:52
忽略這個警告, 要不然就把
int i = 0;
改成
size_t i=0;
作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1602 | 人氣 38709 | 評價 4610 | 評價/貼文 2.88 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/15 下午 02:39:32
for (int i = 0; i < static_cast<int>(v.size()); i++) {

我是這樣寫...
不過不知這樣寫對不對?
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
主題發起人cjchen_tw註記此篇回應為很有道理 2007/10/15 下午 07:56:45
>for (int i = 0; i < static_cast<int>(v.size()); i++) {
>
>我是這樣寫...
>不過不知這樣寫對不對?

有兩種寫法, 一是像 Benson 大大所講的, 用 size_t 來取代 int:

  for (size_t i = 0; ...)

另一個是用 std::vector::size_type:

  for (std::vector::size_type i = 0; ...)

std::vector::size() 傳回的類型是 std::vector::size_type. 通常它是個 typedef, 跟 size_t 相同. 所以 std::<collection>::size_type 跟 size_t 可以通用.

作者 : cjchen_tw(cjchen_tw)
[ 貼文 14 | 人氣 6707 | 評價 0 | 評價/貼文 0 | 送出評價 1 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/15 下午 09:21:00

>另一個是用 std::vector::size_type:
>
>  for (std::vector::size_type i = 0; ...)
>
>std::vector::size() 傳回的類型是 std::vector::size_type. 通常它是個 typedef, 跟 size_t 相同. 所以 std::<collection>::size_type 跟 size_t 可以通用.
>

目前小弟是ignore warning.
但是通常會把 loop 的 index 拿來做一些用途. 比如說:
1. counting, 如例子中 count = count + i;
2. array indexing, 比如說: aArray[pos + i]

這個時候, 就會用到 size_t 到 int 轉換.
STL 在這個部份會不會設計的太封閉了些? 還是說有另外的轉換方式?

感謝回答.
作者 : sflam(Raymond)討論區板主 Visual C++ .NET卓越專家VC++一代宗師新手入門優秀好手資訊類作業求救頂尖高手C++一代宗師貼文超過4000則
[ 貼文 4945 | 人氣 9172 | 評價 32290 | 評價/貼文 6.53 | 送出評價 142 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/15 下午 10:34:44
>目前小弟是ignore warning.
>但是通常會把 loop 的 index 拿來做一些用途. 比如說:
>1. counting, 如例子中 count = count + i;
>2. array indexing, 比如說: aArray[pos + i]
>
>這個時候, 就會用到 size_t 到 int 轉換.
>STL 在這個部份會不會設計的太封閉了些? 還是說有另外的轉換方式?

使用 unsigned type 是因為:
1. 「大小」不可能會有負值.
2. 範圍比 signed type 大.


>但是通常會把 loop 的 index 拿來做一些用途. 比如說:
>1. counting, 如例子中 count = count + i;

即使 'i' 是 unsigned, 編譯器應該不會對這個給 warning. 但你要問自己, 在這個設計裡, 'count' 會有負值嗎? 負值的 count 有意義嗎?


>2. array indexing, 比如說: aArray[pos + i]

同樣的, pos + i 應該也不會導致 warning. 同樣的, 負值的array indexing 只有在很少數的情況下才會用到. 你的程式有需要用到 negative indexing 嗎?

它的 warning 主要是針對 signed/unsigned 的大小比較而發的, 主要原因是提醒程式員避免意料之外的結果. 比方說下面這個程式片段:

  unsigned int ui = 10;
  int i = -10;
  if (i > ui)
  {
    printf("Oops\n");
  }


作者 : kagaya(kagaya) VC++優秀好手C++優秀好手貼文超過1000則人氣指數超過30000點
[ 貼文 1602 | 人氣 38709 | 評價 4610 | 評價/貼文 2.88 | 送出評價 115 次 ] 
[ 給個讚 ]  [ 給個讚 ]  [ 回應本文 ]  [ 發表新文 ]  [ 回上頁 ] [ 回討論區列表 ] [ 回知識入口 ]
2007/10/16 上午 10:01:38
感謝大大的指教~_~
 板主 : 小朱
 > 高手過招區 - 討論區
 - 最近熱門問答精華集
 - 全部歷史問答精華集
 - 高手過招區 - 知識庫
  ■ 全站最新Post列表
  ■ 我的文章收藏
  ■ 我最愛的作者
  ■ 全站文章收藏排行榜
  ■ 全站最愛作者排行榜
  ■  月熱門主題
  ■  季熱門主題
  ■  熱門主題Top 20
  ■  本區Post排行榜
  ■  本區評價排行榜
  ■  全站專家名人榜
  ■  全站Post排行榜
  ■  全站評價排行榜
  ■  全站人氣排行榜
 請輸入關鍵字 
  開始搜尋
 
Top 10
評價排行
高手過招區
1 冼鏡光 410 
2 長長 350 
3 eBoy 290 
4 Benson 280 
5 速定 260 
6 HKLN.net 240 
7 青衫 210 
8 ozzy 190 
9 冷眼 150 
10 John 150 
高手過招區
  專家等級 評價  
  一代宗師 10000  
  曠世奇才 5000  
  頂尖高手 3000  
  卓越專家 1500  
  優秀好手 750  
Microsoft Internet Explorer 6.0. Screen 1024x768 pixel. High Color (16 bit).
2000-2019 程式設計俱樂部 http://www.programmer-club.com.tw/
0.0625