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?
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?
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.
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.
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;
}
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());
}
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 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.