1

ベクトルを作成しようとしていて、while サイクルに入り、そのベクトルを使用してから、各サイクルの最後にベクトルのサイズを変更します。そこでmy_vector.clear()、サイクルの最後とmy_vector.resize(newSize)最初に a を作成することにしました。サンプルコードは次のとおりです。

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、ループの 2 番目の反復で が最初の反復よりも小さい場合、2 番目のループの本体にはまったく入りません。2 回目にサイズが大きくなっても、期待どおりの動作は得られません。

この問題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 に答える