[問題] auto用法一問

作者: WangDaMing (王大明)   2021-11-02 23:11:28
開發平台(Platform): (Ex: Win10, Linux, ...)
Linux
問題(Question):
我本來以為auto可以這樣用,不過這種情況似乎不太適用??
我想要全程使用auto幫我推導,不過vector的size是unsigned我直接這樣用有問題
以我的範例難道我還是只能自己指定j的型態嘛(int)
有比較正確auto的方式嘛??感覺都會推導錯誤??
預期的正確結果(Expected Output):
test 1
test 0
錯誤結果(Wrong Output):
無窮迴圈
程式碼(Code):(請善用置底文網頁, 記得排版,禁止使用圖檔)
#include <iostream>
#include <vector>
using namespace std;
int main(){
vector<int> ans = {1,2,3};
auto n = ans.size();
for(auto j = n - 2;j >= 0;
作者: mikemike1021 (mike)   2021-11-02 23:16:00
因為 auto 會導致他是 unsigned,0-1不會是負數,導致你的迴圈條件永遠成立,所以會是無窮迴圈或者你迴圈條件也可以改成 j < j + 1
作者: aiwhat   2021-11-03 00:38:00
unsigned 和 signed 變數比較時會轉型成 unsignedvector::size 回傳 unsigned → j = n - 2 也是 unsigned
作者: peter98 (新兵)   2021-11-03 03:04:00
Size() returns unsigned
作者: chchwy (mat)   2021-11-03 09:54:00
自動推導的j是無號數阿 無號數怎麼可能會小於零呢?所以你的for loop條件永遠都成立 無法離開回圈
作者: b0920075 (Void)   2021-11-03 12:59:00
推導錯誤x 你寫錯o
作者: KevinR (Kevin)   2021-11-03 13:57:00
推導錯誤X 你用錯○
作者: a27417332 (等號卡比)   2021-11-03 15:17:00
借串問,好奇對於這種unsigned然後往下數的狀況通常for裡面會怎麼寫?
作者: nh60211as   2021-11-03 15:43:00
不要往下數或是用reverse iterator
作者: sarafciel (Cattuz)   2021-11-03 19:45:00
1.你如果不知道型態 最好不要用auto2. 你如果不知道發生什麼事 最好也不要講推導錯誤
作者: WangDaMing (王大明)   2021-11-03 23:30:00
感謝以上各位大大~其實我是想問這有沒有較好的寫法還是就真的不知道size的型態不要隨便用auto...Orz
作者: ketrobo (貓蘿蔔)   2021-11-04 00:01:00
不知道就學一下const iterator,粉好用
作者: tomsawyer (安安)   2021-11-04 01:39:00
我的話 覺得auto拿來接iterator可以少打字 lol
作者: NciscalA   2021-11-04 09:28:00
for_each + reverse iterator
作者: a27417332 (等號卡比)   2021-11-04 19:46:00
萬一是需要index呢?該不會用rev iter+額外index吧?
作者: nh60211as   2021-11-04 19:48:00
可以用std::distance
作者: chchwy (mat)   2021-11-05 07:30:00
真的要往下數...就用int啊,不要auto推導就好了
作者: firejox (Tangent)   2021-11-05 10:35:00
作者: steve1012 (steve)   2021-11-05 13:12:00
不要濫用auto 就解決了type information很好用 除非真的很有幫助 (e.g. itererator type name 很長) 最好都直接寫type name
作者: Dracarys (MayShowGunMore)   2021-11-07 23:45:00
它照你打的執行沒有錯啊 unsigned沒問題 推導沒有錯
作者: alex780312 (Alex)   2021-11-09 07:37:00
同一行就知道型態時可以auto一下,例如auto ptr =make_unique<MyClass>(…);我是建議不要自己把size_t和unsigned 互換,是長度就維持size_t。甚至要用using MyNumber = int;的方式確保不會讓所有函數都吃最基本形態而看不出是啥東西。早起的NULL 變成現在nullptr 也是一個可以學習的例子形態名字太長可以用using改善,auto是避免冗余描述,例如使用template 時的例子
作者: Dracarys (MayShowGunMore)   2020-01-11 08:56:00
最近看到一本C的書是這樣寫,一樓也有提到,>=改成<=:https://godbolt.org/z/eqec86jTE

Links booklink

Contact Us: admin [ a t ] ucptt.com