2

ベクトルへの反復子があります。イテレータが指しているインデックスを知りたい。だから私は次のようにしましたが、よくわかりません。

int temp = -1;
std::vector <int> ::iterator f;

for (f=eFace[e].begin(); f!=eFace[e].end(); ++f)
{
    if (*f == face)
{
    switch (f-eFace[e].begin())
    {
        case 0:
        temp = 5;                                   
        break;
        case 1:
        temp = 3;
        break;
        case 2:
        temp = 4;
        break;
        case 3:
        temp = 1;
        break;
        case 4:
        temp = 2;
        break;
        case 5:
        temp = 0;
        break;
            default:
        throw;
    }

    break;
    }
}
4

5 に答える 5

4
std::vector<int>::size_type index = std::distance (eFace [e].begin(), f);

ただし、ループごとに実行すると遅くなる可能性があることに注意してください。ベクトルの別のオプションは次のとおりです。

std::vector<int>::size_type index = f - eFace [e].begin();

以下の Steve Jessop によって指摘されているように、ベクトルは減算を定義する必要があるランダムアクセス反復子を使用するため、これは機能します。

于 2012-04-27T10:40:47.970 に答える
2

このようなものではないのはなぜですか:

std::vector <int> ::iterator f;

int index = 0;

for (f=eFace[e].begin(); f!=eFace[e].end(); ++f)
{
     // do sth

     index++;
}
于 2012-04-27T10:42:01.027 に答える
2

より明確なコードを取得する方がはるかに簡単です。

まず、ベクトルで値を見つけます。

// Returns the index of `face` in `vec`.
// If `face` is not present in `vec`, returns `vec.size()`.
size_t findFaceIndex(int const face, std::vector<int> const& vec) {
    std::vector<int>::const_iterator const it =
        std::find(vec.begin(), vec.end(), face);

    return it - vec.begin();
}

そして今マッピング:

static int const FaceMap[] = { 5, 3, 4, 1, 2, 0 };
static size_t const FaceMapSize = sizeof(FaceMap)/sizeof(int);

// Translate face index into ...
int faceIndexToX(size_t const index) {
    if (index >= FaceMapSize) { throw std::runtime_error("out of bounds"); }
    return FaceMap[index];
}
于 2012-04-27T11:21:08.273 に答える
0

あなたの質問に対して、「イテレータがどのインデックスを指しているのか知りたい」。と言うstd::vector<int>::iterator f = eFace.begin();ことで、インデックスアプローチに似たインターレーターを作成していると言いstd::vector<int>::size_type i = 0;ます。

イテレータを使用するeFace.begin()と、ループを使用してベクトルをウォークスルーするときに使用するのと!= eFace.end()同じ方法で使用します。i = 0!= eFace.size()for

少なくとも、それがあなたの最初の質問だったと思います。

于 2012-04-27T11:18:37.810 に答える
0

とにかくイテレータがあるのに、なぜ配列のインデックスが必要なのだろうか?イテレータがランダム アクセスである場合はから減算できbegin()ますが、インデックスが非常に重要な場合は、イテレータではなくそれを使用した方がよいのではないでしょうか。もちろん、リファクタリングするコードにアクセスできるかどうかによって異なります。 .

スイッチで何を達成しようとしているのかよくわかりませんが、値をマップする場合は、おそらくスパースベクトルの方がはるかに適切でしょうか?

于 2012-04-27T11:30:28.120 に答える