544 Stimmen

Was ist der effektivste Weg, um den Index eines Iterators eines std::Vektors zu ermitteln?

Ich bin Iteration über einen Vektor und benötigen den Index der Iterator zeigt derzeit auf. AFAIK kann dies auf zwei Arten geschehen:

  • it - vec.begin()
  • std::distance(vec.begin(), it)

Was sind die Vor- und Nachteile dieser Methoden?

5voto

Stéphane Punkte 6770

Según http://www.cplusplus.com/reference/std/iterator/distance/ da vec.begin() ist eine Zufallszugriff Iterator, verwendet die Distanzmethode die - Betreiber.

Die Antwort ist also, dass es von der Leistung her dasselbe ist, aber vielleicht mit distance() ist leichter zu verstehen, wenn jemand Ihren Code lesen und verstehen muss.

3voto

Alexander Gessler Punkte 44223

Ich würde die - Variante für std::vector nur - es ist ziemlich klar, was gemeint ist, und die Einfachheit der Operation (die nicht mehr als eine Zeigersubtraktion ist) wird durch die Syntax ausgedrückt ( distance auf der anderen Seite, klingt beim ersten Lesen wie Pythagoras, nicht wahr?). Wie OnkelBen anmerkt, - dient auch als statische Zusicherung für den Fall, dass vector wird versehentlich geändert in list .

Ich glaube auch, dass es viel häufiger vorkommt - habe aber keine Zahlen, um das zu beweisen. Hauptargument: it - vec.begin() ist im Quellcode kürzer - weniger Tipparbeit, weniger Platzverbrauch. Da es klar ist, dass die richtige Antwort auf Ihre Frage Geschmackssache ist, kann dies auch ein gültiges Argument sein.

1voto

Spongman Punkte 9030

Ich habe dies gerade entdeckt: https://greek0.net/boost-range/boost-adaptors-indexed.html

    for (const auto & element : str | boost::adaptors::indexed(0)) {
        std::cout << element.index()
                  << " : "
                  << element.value()
                  << std::endl;
    }

0voto

Hier ist ein Beispiel, um "alle" Vorkommen von 10 zusammen mit dem Index zu finden. Ich dachte, das könnte hilfreich sein.

void _find_all_test()
{
    vector<int> ints;
    int val;
    while(cin >> val) ints.push_back(val);

    vector<int>::iterator it;
    it = ints.begin();
    int count = ints.size();
    do
    {
        it = find(it,ints.end(), 10);//assuming 10 as search element
        cout << *it << " found at index " << count -(ints.end() - it) << endl;
    }while(++it != ints.end()); 
}

0voto

Neben int float string etc. können Sie zusätzliche Daten in .second einfügen, wenn Sie verschiedene Typen verwenden, wie z.B.:

std::map<unsigned long long int, glm::ivec2> voxels_corners;
std::map<unsigned long long int, glm::ivec2>::iterator it_corners;

ou

struct voxel_map {
    int x,i;
};

std::map<unsigned long long int, voxel_map> voxels_corners;
std::map<unsigned long long int, voxel_map>::iterator it_corners;

wenn

long long unsigned int index_first=some_key; // llu in this case...
int i=0;
voxels_corners.insert(std::make_pair(index_first,glm::ivec2(1,i++)));

ou

long long unsigned int index_first=some_key;
int index_counter=0;
voxel_map one;
one.x=1;
one.i=index_counter++;

voxels_corners.insert(std::make_pair(index_first,one));

mit dem richtigen Typ || Struktur können Sie alles in die .second einfügen, einschließlich einer Indexnummer, die beim Einfügen inkrementiert wird.

anstelle von

it_corners - _corners.begin()

ou

std::distance(it_corners.begin(), it_corners)

nach

it_corners = voxels_corners.find(index_first+bdif_x+x_z);

der Index ist einfach:

int vertice_index = it_corners->second.y;

bei Verwendung des Typs glm::ivec2

ou

int vertice_index = it_corners->second.i;

im Falle des Datentyps Struktur

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X