0

次のようなベクトルのベクトルがあります。

あ: 0 1 0

b: 1 0 1

c: 0 1 1

私のプログラムのこの部分は機能します。0 を削除したいので remove_if を使用し、1 を t と位置に置き換えたいので、replace_if を使用して最終的に次のようなものを作成します。

を: t2

b: t1、t3

c: t2、t3

これら2つのことは私のプログラムでは機能せず、もうわかりません。問題の1つは、intに「t」を入れたいのですが、これに文字列を使用できるかどうかわかりません。

これが私のコードです:

#include <iostream>
#include <vector>
#include <iterator>

     int main (){
    srand(time(0));
    int e = (rand() % 10) + 3;
    int tim = (rand() % 10) +1 ;
    std::vector< std::vector<int> > myvector;
    std::cout << "Time: 0 = Not available, 1 = available" << std::endl;

    for(int vec = 0; vec < e; vec++){
            std::vector<int> newVector(tim);
            for(int i = 0; i < tim; i++){
                    newVector[i] = (rand() % 2);
            }
            myvector.push_back(newVector);
            std::cout << "The Time " << (vec+1) << " is ";
            for(int b = 0; b < tim; b++){
                    int value = myvector[vec][b];
                    std::cout << " " << value << " ";
            }
    }
    //Delete the 0 in time
    int int_to_remove = 0;
    remove_if(myvector.begin(), myvector.end(), int_to_remove);
    std::cout << "The new Time "<< std::endl;
    copy(myvector.begin(), myvector.end(), output);

    //Change the name of 1 to t1
    int int_to_replace = 1;
    replace_if(myvector.begin(), myvector.end(), int_to_replace, t(tim));
    std::cout << "The new Time"<< std::endl;
    copy(myvector.begin(), myvector.end(), output);

    return 0;
    }

ありがとう

4

2 に答える 2

1

あなたはそこでいくつかの間違いを犯しています。リーディングを出力に出力したいだけの場合tは、コードの関連部分をどのように書き換えるべきかを以下に示します。値が先頭にある要素のコンテナーが実際に必要な場合でもt(この場合はstrings のコンテナーでなければなりません)、元のコードで要素を削除する部分と要素を置き換える部分が必要であることに注意してください。間違っています。

関連する部分を次のように書き換えます。

#include <algorithm>   // For copy(), replace(), erase(), and for_each()
#include <iterator>    // For ostream_iterator

// ...

int main () {

// ...

    //Delete the 0 in time
    int int_to_remove = 0;
    std::cout << "The new Time "<< std::endl;
    for_each(begin(myvector), end(myvector), [=] (std::vector<int>& v)
    {
        v.erase(remove(begin(v), end(v), int_to_remove), end(v));
    //  ^^^^^^^^^^^^^^                                 ^^^^^^^^
    //  If you don't do the above, your container won't be resized,
    //  and will have trailing "dead" elements. Moreover, if you
    //  use remove_if() with a predicate which is always equal to 0,
    //  you won't remove any element.

        copy(begin(v), end(v), std::ostream_iterator<int>(std::cout, " "));
    //                         ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
    //                         This is how you can copy each element to the
    //                         standard output.

        std::cout << std::endl;
    });

    //Change the name of 1 to t1
    int int_to_replace = 1;
    std::cout << "The new Time "<< std::endl;
    for_each(begin(myvector), end(myvector), [=] (std::vector<int>& v)
    {
        // This does the replacement. Again, using replace_if() is wrong,
        // because you are not passing in a predicate, but a value.
        replace(begin(v), end(v), int_to_replace, tim);

        // This prints each element of the vector with a leading 't'
        for_each(begin(v), end(v), [] (int i)
        {
            std::cout << "t" << i << " ";
        });

        std::cout << std::endl;
    });

    // ...
}
于 2013-03-12T10:37:36.850 に答える
0

t1などの文字列値が必要なため、intの代わりに文字列のベクトルのベクトルを使用します。すなわち交換

std::vector< std::vector<int> > myvector;

std::vector< std::vector<std::string> > myvector;

文字列「0」と「1」を割​​り当てるには、newVector [i] =(rand()%2);を置き換えることができます。に

if(rand() % 2)
  newVector[i] = "1";
else
  newVector[i] = "0";

文字列比較演算子std::string :: compareを使用して、残りの整数比較を変更する必要があります。

于 2013-03-12T10:23:06.660 に答える