我正在尝试制作一个矢量,然后输入一个while循环,使用该矢量,然后在每个循环结束时调整矢量大小。所以我决定在周期结束时制作my_vector.clear()
,并在其开头my_vector.resize(newSize)
。这是一个示例代码:
typedef struct my_type{
int numNextDom;
bool knockedDown;
} my_type;
int main (int argc, char * const argv[]) {
int i, testCase, totalDom, numLines, num_dom=0, num_next_dom=0, aux_map_int = 0, linesScanned = 0;
bool firstTime=true;
std::cin>>testCase;
std::vector<my_type> my_vector;
while(aux_map_int < testCase){
std::cin>>totalSize>>numLines;
my_vector.resize(totalSize);
while (linesScanned < numLines) {
std::cin>>num_dom>>num_next_dom;
if(firstTime){
my_vector[0].numNextDom = totalSize;
my_vector[0].knockedDown = true;
firstTime=false;
}
my_vector[num_dom].numNextDom = num_next_dom;
my_vector[num_dom].knockedDown = false;
linesScanned++;
}
std::cout << giveResult(my_vector) << std::endl;
aux_map_int++;
my_vector.clear();
}
return 0;
}
所以你看,在我做my_vector.clean()
之后,向量变为os大小为1,但是当重新完成循环时,my_vector
保持大小为1并且不执行{{ 1}}。
我错过了什么吗?
答案 0 :(得分:3)
我运行了你的代码并正确调整了矢量大小。
我认为您的问题是您在第一次测试后没有重置linesScanned
,所以如果totalSize
在循环的第二次迭代中比在第一次迭代时小,那么你就不会完全进入第二个循环的主体。即使它第二次变大,你也不会得到你期望的行为。
您可以通过添加linesScanned = 0;
作为外部循环的第一个语句来解决此问题,即在while(aux_map_int < testCase){
之后
另外,我建议你使用for循环,因为它们更干净,可以帮助你避免将来出现这样的错误。
这是我测试过的程序:
#include <iostream>
#include <vector>
int totalSize = 0;
typedef struct my_type{
int numNextDom;
bool knockedDown;
} my_type;
int giveResult(std::vector<my_type>);
int main (int argc, char * const argv[]) {
int i, testCase, totalDom, numLines, num_dom=0, num_next_dom=0, aux_map_int = 0, linesScanned = 0;
bool firstTime=true;
std::cin>>testCase;
std::vector<my_type> my_vector;
while(aux_map_int < testCase){
std::cin>>totalSize>>numLines;
my_vector.resize(totalSize);
std::cout << "my_vector.size(): " << my_vector.size() << std::endl;
std::cout << "linesScanned: " << linesScanned << std::endl;
std::cout << "numLines: " << numLines << std::endl;
while (linesScanned < numLines) {
std::cin>>num_dom>>num_next_dom;
if(firstTime){
my_vector[0].numNextDom = totalSize;
my_vector[0].knockedDown = true;
firstTime=false;
}
my_vector[num_dom].numNextDom = num_next_dom;
my_vector[num_dom].knockedDown = false;
linesScanned++;
}
std::cout << giveResult(my_vector) << std::endl;
aux_map_int++;
my_vector.clear();
}
return 0;
}
int giveResult(std::vector<my_type>) {
return 0;
}
这是我的控制台的交互会话:
2
2 2
my_vector.size(): 2
linesScanned: 0
numLines: 2
5 5
6 6
0
3 2
my_vector.size(): 3
linesScanned: 2
numLines: 2
在这里你可以看到linesScanned没有被重置并且会导致问题。
这是主函数的正确版本(关于此问题):
int main (int argc, char * const argv[]) {
int i, testCase, totalDom, numLines, num_dom=0, num_next_dom=0, aux_map_int = 0, linesScanned = 0;
bool firstTime=true;
std::cin>>testCase;
std::vector<my_type> my_vector;
while(aux_map_int < testCase){
linesScanned = 0;
std::cin>>totalSize>>numLines;
my_vector.resize(totalSize);
while (linesScanned < numLines) {
std::cin>>num_dom>>num_next_dom;
if(firstTime){
my_vector[0].numNextDom = totalSize;
my_vector[0].knockedDown = true;
firstTime=false;
}
my_vector[num_dom].numNextDom = num_next_dom;
my_vector[num_dom].knockedDown = false;
linesScanned++;
}
std::cout << giveResult(my_vector) << std::endl;
aux_map_int++;
my_vector.clear();
}
return 0;
}
我希望能够清除它。
-Stan