vector size陷阱 -1>0问题

本文揭示了在C++中,当vector的size为0时,进行size-1操作可能导致的越界输出问题。通过深入分析,解释了为何使用`cout<<size-1;`和`printf%d`输出结果不同,并提供解决方案。

如果在某种情况下某个vector的size为0,然后size-1按理说应该是-1,但是这时候会出问题的,因为一个有符号数一个无符号数,相减,都是先转化为usigned再去运算


这样如果用cout<<size-1;输出的就是一个快越界的数字。如果用printf%d则输出的就是-1;

好可恶的bug。需要注意啊

这个关键路径问题大部分测试点通过,但有少部分测试点没有通过,这是哪里有问题? #include <iostream> //#include<string> #include<vector> //#include<stack> //#include <queue> //#include<set> using namespace std; //邻接表 struct edge { int val; //终点 int wei; edge* next = nullptr; }; struct node { int val; edge* first_edge = nullptr; edge* last_edge = nullptr; }; int n, e; vector<node*> nodes; void add_edge(int node, int val, int wei) { if (node < 0 || node >= n) return; edge* temp = new edge; temp->val = val; temp->wei = wei; if (!nodes[node]->first_edge) { nodes[node]->first_edge = temp; nodes[node]->last_edge = temp; } else { edge* tttt = nodes[node]->first_edge; if (val < tttt->val) { temp->next = nodes[node]->first_edge; nodes[node]->first_edge = temp; return; } while (tttt->next) { if (val < tttt->next->val) { temp->next = tttt->next; tttt->next = temp; return; } tttt = tttt->next; } tttt->next = temp; nodes[node]->last_edge = temp; } } void build_tu() { nodes = vector<node*>(n); for (int i = 0;i < n;i++) { nodes[i] = new node; nodes[i]->val = i; } for (int i = 0;i < e;i++) { int a, b, weii; scanf_s("%d %d %d", &a, &b, &weii); add_edge(a - 1, b - 1, weii); //int a, b; //scanf_s("%d %d", &a, &b); //add_edge(a, b,1); } } void print_tu() { bool b = false; for (int i = 0;i < n;i++) { b = false; edge* temp = nullptr; if (nodes[i]->first_edge) { b = true; temp = nodes[i]->first_edge; printf("%d:", i); } while (temp) { printf("(%d,%d,%d)", i, temp->val, temp->wei); temp = temp->next; } if (b) printf("\n"); } } void delete_tu() { for (int i = 0;i < n;i++) { edge* temp = nullptr; if (nodes[i]->first_edge) temp = nodes[i]->first_edge; while (temp) { edge* tttt = temp; if (temp) temp = temp->next; if (tttt) delete tttt; } delete nodes[i]; } } vector<int>ru; //入度 vector<int>book; //是否已输出 vector<int> topoed; bool TopoSort() { ru = vector<int>(n, 0); book = vector<int>(n, 0); topoed = vector<int>(0); //printf("1"); for (int i = 0;i < n;i++) { edge* temp = nodes[i]->first_edge; if (!temp) continue; for (;temp != nullptr;temp = temp->next) { ru[temp->val]++; } } //printf("2"); for (int j = 0;j < n;j++) { int chu = -1; //printf("3"); for (int i = 0;i < n;i++) { if (ru[i] <= 0 && book[i] == 0) { chu = i; break; } } //printf("4"); if (chu < 0 || chu >= n) return false; book[chu] = 1; topoed.push_back(chu); edge* temp = nodes[chu]->first_edge; for (;temp != nullptr;temp = temp->next) { ru[temp->val]--; } } return true; } vector<int> ve; vector<int> vl; void count_key() { ve = vector<int>(n, 0);vl = vector<int>(n, 0); //pr1 = vector<int>(0);pr2 = vector<int>(0); //printf("11"); for (int i = 0;i < n;i++) { int k = topoed[i]; for (edge* temp = nodes[k]->first_edge;temp != nullptr;temp = temp->next) { int too = temp->val; if (temp->wei + ve[k] > ve[too]) { ve[too] = temp->wei + ve[k]; } } } int ans = 0;int end_node; for (int i = 0;i < n;i++) { //ans = max(ans, ve[i]); if (ve[i] >= ans) { ans = ve[i]; end_node = i; } } printf("%d\n", ans); //printf("22"); for (int i = 0;i < n;i++) vl[i] = ve[end_node]; for (int i = n - 1;i >= 0;i--) { int k = topoed[i]; for (edge* temp = nodes[k]->first_edge;temp != nullptr;temp = temp->next) { int too = temp->val; vl[k] = min(vl[k], vl[too] - temp->wei); } } //printf("33"); for (int i = 0;i < n;i++) { for (edge* temp = nodes[i]->first_edge;temp != nullptr;temp = temp->next) { int k = temp->val, w = temp->wei; if (vl[k] == w + ve[i]) { printf("%d->%d\n", i + 1, k + 1); //pr1.push_back(i + 1); //pr2.push_back(k + 1); } } } } void solve() { scanf_s("%d %d", &n, &e); build_tu(); //printf("a"); //print_tu(); //printf("\n"); if (!TopoSort()) { printf("unworkable project\n"); delete_tu(); return; } //for (auto i : topoed) { // printf("%d\n", i); //} //printf("b"); count_key(); //printf("%d\n", ans); //int lll = pr1.size(); //for (int i = 0;i < lll;i++) { // printf("%d->%d\n", pr1[i],pr2[i]); //} delete_tu(); } signed main() { solve(); return 0; }
最新发布
12-01
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值