for循环中获取vector<int>前值异常:0/1序列AvgCan重置逻辑问题
Hey there, let's break down why your reset logic isn't triggering when the value in your 0/1 vector switches, and how to fix it.
The Root Cause
The most likely culprit is invalid access to the "previous element" in your loop. If you're starting your loop at index 0, trying to access vec[i-1] (which becomes vec[-1] when i=0) leads to undefined behavior. You'll end up reading a random garbage value from memory, which might appear as a "constant" value—this breaks your check for whether the current element differs from the previous one.
Another possible issue is if you're storing the previous value in a variable but forgetting to update it after each iteration, leaving it stuck on the first element forever.
The Corrected Implementation
Here's a fixed version of your logic that addresses the index problem and follows your requirements strictly:
#include <vector> #include <iostream> int main() { std::vector<int> input_vec = {1,1,1,1,0,0,0,0}; int AvgCan = 0; // Handle empty vector case to avoid crashes if (input_vec.empty()) { std::cout << "Vector is empty!" << std::endl; return 0; } // Initialize for the first element (no previous value to compare) AvgCan = input_vec[0] == 1 ? 1 : -1; std::cout << "Index 0: AvgCan = " << AvgCan << "\n"; // Start loop from index 1, since we already handled the first element for (size_t i = 1; i < input_vec.size(); ++i) { // Check if current value differs from the previous one if (input_vec[i] != input_vec[i-1]) { AvgCan = 0; std::cout << "Index " << i << ": Reset AvgCan to 0\n"; } // Update AvgCan based on current value if (input_vec[i] == 1) { AvgCan++; } else { AvgCan--; } std::cout << "Index " << i << ": AvgCan = " << AvgCan << "\n"; } return 0; }
How This Works
- Empty Vector Check: We first make sure the vector isn't empty to avoid invalid access.
- First Element Initialization: Since there's no previous element for the first index, we directly set
AvgCanto1(if the first value is 1) or-1(if it's 0)—this aligns with your "increment for 1, decrement for 0" rule starting from 0. - Valid Previous Element Access: Starting the loop at
i=1lets us safely accessinput_vec[i-1](the actual previous element in the vector) without out-of-bounds errors. - Reset & Update: When the current value differs from the previous, we reset
AvgCanto 0, then adjust it based on the current value as required.
Test Output for Your Sample Data
Running this code with {1,1,1,1,0,0,0,0} will produce:
Index 0: AvgCan = 1 Index 1: AvgCan = 2 Index 2: AvgCan = 3 Index 3: AvgCan = 4 Index 4: Reset AvgCan to 0 Index 4: AvgCan = -1 Index 5: AvgCan = -2 Index 6: AvgCan = -3 Index 7: AvgCan = -4
You can see the reset triggers correctly when the value switches from 1 to 0 at index 4.
Another Common Pitfall to Avoid
If you choose to track the previous value with a variable instead of using input_vec[i-1], make sure to update it every loop iteration:
// Correct variable-based tracking int prev_val = input_vec[0]; for (size_t i = 1; i < input_vec.size(); ++i) { if (input_vec[i] != prev_val) { AvgCan = 0; } // ... update AvgCan ... prev_val = input_vec[i]; // Don't forget this line! }
内容的提问来源于stack exchange,提问作者Pete Zíťák

