очистить и изменить размер вектора

Я пытаюсь создать вектор, затем ввести цикл 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() вектор становится размером ОС 1, но затем, когда цикл повторен, my_vector остается размером 1 и не делает my_vector.resize(totalSize),
Я что-то пропустил?

1

Решение

Я запустил ваш код и вектор правильно изменил размер.

Я думаю, что ваша проблема в том, что вы не сбрасываете linesScanned после первого теста, так что если totalSize меньше на второй итерации цикла, чем на первой, вы вообще не будете вводить тело второго цикла. Даже если он будет больше во второй раз, вы не получите ожидаемого поведения.

Вы можете исправить эту проблему, добавив linesScanned = 0; в качестве первого утверждения внешнего цикла, то есть сразу после while(aux_map_int < testCase){

Также я предлагаю вам использовать петли, так как они более чистые и помогут вам избежать подобных ошибок в будущем.

Вот программа, которую я тестировал:

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

Я надеюсь, что это проясняет.

-Стан

3

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]