清除并调整矢量大小 - c ++

时间:2013-03-14 18:07:13

标签: c++ vector resize clear

我正在尝试制作一个矢量,然后输入一个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}}。 我错过了什么吗?

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