-2

2つの質問がありますが、それらは相互に関連しています。

part:a->

ベクトルの要素を逆の順序で表示しようとしています。しかし、何も機能していません。私はイテロタールを次のように使用しました。

for (it=vec.end(); it!=vec.begin(); --it){ 
// it is iterator not reverse_iterator.
// do work
}

PS私はイテレータにあまり精通していません。私は今日初めてそれらを使用して、elemを逆の順序で表示しました。

また試しました。

for (int i=vec.size(); i!=0; i--){
//display
}

私が何をしても、常に要素が存在するのと同じ順序で表示されます。つまり、逆の順序では表示されません。

part_b->

再帰関数の出力をベクトルに直接格納できる方法はありますか?コードのように:私はこれが機能しないことを知っています。私は試しましたが、私が何をしているのかをあなたに教えてくれます。

#include <iostream>
using namespace std;
#include "vector"

int func(int num);
vector <int> vec;

int main() {
    int num=34;
    // I know this would not work. But is there any possibilitiy that
    // I can store the output in a vector.
    vec = binary(num);                          

    // trying to display the vector.        
    for (int i=vec.size();i!=0;i--) {
        cout<<vec[i]<<" ";
    } // not working for reverse display.
} //main.

int func(int num) {
    if (num==1) {
        //vec.push_back(1);
        return 1;
    }
    else if(num==0) {
        //vec.push_back(0);
        return 0;
    }
    else {
        //vec.push_back(input%2);
        return binary(input/2);
    }
} //func.

質問を理解していただければ幸いです。パートbを実行できる場合は、ベクトルの要素を逆にする必要はありません。

4

4 に答える 4

5

標準ソリューションでは、逆イテレータを使用します。

for (auto it = v.rbegin(); it != v.rend(); ++it)
{
    if (it != v.rbegin()) { std::cout << ' '; }
    std::cout << *it;
}

または、インデックスを使用することもできますが、「反転」イディオムを維持し、インデックスをインクリメントします。

for (std::size_t i = 0; i != v.size(); ++i)
{
    if (i != 0) { std::cout << ' '; }
    std::cout << v[v.size() - i - 1];
}

逆イテレータは、文字通り、内部の明示的なループと非常によく似た処理を行っていることに注意してください。特に、逆イテレータのメンバー関数は、インデックスの計算にbase()あるのと同じように、対応する通常のイテレータを1オフセットします。- 1(たとえば、内部にrbegin()ありend()ますが、間接参照すると1つずつ減少します。)

于 2012-12-16T14:36:58.607 に答える
2

逆イテレータを使用します。

for (auto it = vec.crend(); it != vec.crbegin(); ++it) {
    std::cout << *it << ' ';
}
std::cout << '\n';
于 2012-12-16T14:36:49.973 に答える
2

パートA

C ++11にアクセスできないと仮定します。

vector<int>::const_reverse_iterator it;
for (it=vec.rbegin(); it!=vec.rend(); ++it)
{ 
    // do work
}

パートB

数値を2進数で表示しようとしているように見えます。残念ながら、ostreamの標準フラグでは、私が知る限り、16進数、10進数、または8進数しか許可されていませんが、これを行うためのより簡単な方法を提案できますか?

#include <bitset>

bitset< sizeof(int) << 3 > b(34);
cout << b << endl;

これは次のようになります。

00000000000000000000000000100010

かなり醜い見た目は、切り捨てを回避するためにビット単位sizeof(int) << 3のサイズを取得する方法にすぎません。int

于 2012-12-16T14:40:41.807 に答える
-1

私は役立つかもしれない小さなプログラムを書きました。多分あなたのベクトルは空ですか?

#include <iostream>
#include <vector>
using namespace std;
int main(int argc, char *argv[])
{
    vector<int> vec;
    vec.insert(vec.begin(), 1, 1);
    vec.insert(vec.begin(), 1, 2);
    vec.insert(vec.begin(), 1, 3);
    vector<int>::iterator i;
    for (i = vec.end(); i != vec.begin(); --i)
    {
        cout << *i;
    }
    cout << *i;
    return 0;
}
于 2012-12-16T14:40:40.413 に答える