gpt4 book ai didi

c++ - 清除并调整 vector 大小 - C++

转载 作者:行者123 更新时间:2023-11-30 02:56:31 25 4
gpt4 key购买 nike

我正在尝试创建一个 vector ,然后进入一个 while 循环,使用该 vector ,然后在每个循环结束时调整 vector 的大小。所以我决定在循环结束时制作 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() 之后, vector 变为 os 大小 1,但是随后,当循环重新完成时,my_vector 保持不变大小 1 并且不执行 my_vector.resize(totalSize)。我错过了什么吗?

最佳答案

我运行了您的代码并正确调整了 vector 的大小。

我认为你的问题是你没有重置 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;
}

这是来 self 的控制台的交互 session :

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;
}

我希望一切都解决了。

-斯坦

关于c++ - 清除并调整 vector 大小 - C++,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15416937/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com