1

我正在尝试制作一个向量,然后输入一个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 并且不执行my_vector.resize(totalSize). 我错过了什么吗?

4

1 回答 1

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

我希望这能清除它。

-斯坦

于 2013-03-14T18:26:48.670 回答