Dieser Teil im Code Art von hässlich aussieht ...
std::map<int, std::pair< const int, const std::vector<POINT_3d> > > m_srcHitData;
Sie könnten versuchen, Ihren Code Umstrukturierung ein wenig.
struct Pair {
unsigned int key_;
std::vector<POINT_3d> points_;
Pair() {} // Empty Default
Pair(const unsigned int& key, const std::vector<POINT_3d>& points) :
key_(key),
points_(points)
{}
};
Then ...
std::map<unsigned, Pair> m_srcHitData;
void addHit(const int edgeId, const int hit) {
m_srcHitData[edgeId] = Pair(hit, std::vector<POINT_3d>());
}
Ich habe dieses kurzes Programm eine ähnliche Struktur zu simulieren, nur habe ich strings
anstelle Ihrem std::vector<POINT_3d>
#include <string>
#include <iostream>
#include <map>
struct Pair {
unsigned key_;
std::string value_;
Pair() {}
Pair(const unsigned int& key, const std::string& value) :
key_(key),
value_(value) {}
};
class MyClass {
public:
std::map<unsigned, Pair> myMap_;
void addValue(const unsigned int& key, const std::string& value) {
myMap_[key] = Pair(key, value);
}
};
int main() {
MyClass myClass;
myClass.addValue(1, "Hello");
myClass.addValue(2, "World");
typedef std::map<unsigned, Pair>::iterator Iter;
Iter it = myClass.myMap_.begin();
for (; it != myClass.myMap_.end(); ++it) {
std::cout << "Key: " << it->first << " Pair-Key: " << it->second.key_ << " Pair-value: " << it->second.value_ << std::endl;
}
std::cout << "\nPress any key and enter to quit." << std::endl;
char c;
std::cin >> c;
}
Sie die oben verwenden können, außer ersetzen Sie Ihre Objekte von vector<T>
durch die strings
.
Ich verwendete auch öffentliche Schnittstelle auf beiden struct
und class
für die Einfachheit der Demonstration. Normalerweise wäre der Container in der class
entweder protected
oder private
mit Zubehörfunktionen.
BEARBEITEN Dies hilft beim Erstellen der Karte zuerst. Sobald die Karte funktioniert, können Sie sie ändern, um sie bei Bedarf in die Speicherbereiche const
einzufügen. Es kann jedoch schwierig sein, mit ihnen zu arbeiten. Siehe den Link in einpoklums Antwort.
Wenn Sie mit den neueren Versionen von C arbeiten ++ können Sie diese Zeilen Code ändern:
typedef std::map<unsigned, Pair>::iterator Iter;
Iter it = myClass.myMap_.begin();
in diese:
auto it = myClass.myMap_.begin();
Anstelle der Verwendung von 'm_srcHitData [edgeId] = std :: make_pair (hit, std :: vector()); 'versuchen Sie es mit' m_srcHitData [edgeId] .insert (std :: make_pair (hit, std :: vector ()); 'und sehen, ob dies funktioniert oder Ihnen eine anderer Compilerfehler.Hmm, jetzt, da ich über diesen Einschub dachte, kann nicht an 'm_srcHitDat [idx]' dasselbe Problem wie einpoklum, das wegen constness angegeben wird, arbeiten. –
@Francis Sie meinten eigentlich nicht m_srcHitData [edgeId] .insert(), oder? Es sollte m_srcHitData.insert (pair (edgeId, ...)) sein. Das funktioniert, danke! –
und als ich antwortete, hatte ich meine IDE nicht geöffnet. Also versuchte ich, das Gedächtnis zu verlieren ... beziehe mich auf meine Antwort als den richtigen Weg, um die Karte zu erstellen. –