В следующем коде показана очень простая, но важная функциональность, которую я хотел бы создать, и в настоящее время я получаю некоторые неприятные ошибки времени выполнения, которые я не смог отладить самостоятельно. Я работал над тем, чтобы написать решение того, что я ищу, и это самое близкое, что я нашел. Мы будем очень признательны за любую помощь в определении исправления или перепроектирования этой реализации!
Это класс. То, что я ищу, - это карта, которая по-прежнему может выполнять свою функциональность оператора [ключ], но также может повторяться в последовательном порядке по мере добавления элементов. Я пытаюсь сделать это, имея карту для поиска, значение которой является указателем на реальное значение, хранящееся в векторе соответствующих пар.
template <typename t>
class IndexedMap {
public:
t& operator [] (string s) {
bool nu = true;
for (auto& e : actual) // for each pair
if (e.first == s) // if exist
nu = false;
if (nu == true) { // if needs created
actual.push_back(pair <string, t>()); // create proper pair
actual.back().first = s; // assign key
// create copy in map @ same key pointing to actual value
lookup[s] = &actual.back().second;
}
return *lookup[s]; // return reference to value
}
typename vector <pair <string, t>>::iterator begin () {
return actual.begin();
}
typename vector <pair <string, t>>::iterator end () {
return actual.end();
}
private:
vector <pair <string, t>> actual;
map <string, t*> lookup;
};
Эта реализация "работает" со следующим test.cpp - это означает, что он будет запущен, и я действительно вижу результат, который ищу, но после выхода из test.cpp я получаю несколько сумасшедших ошибок, связанных с вызовом free() и Я не уверен, как это происходит или как это исправить.
test.cpp:
int main () {
IndexedMap <vector <int>> test;
test["BILLS"]; test["GAS"];
test["GROCERY"]; test["PETS"];
test["TAKEOUT"]; test["OTHER"];
int i = 0;
for (auto e : test) // check order
cout << e.first << endl;
for (auto& e : test) // assign 3 unique values to each vector
for (int f = 0; f < 3; ++f, ++i)
e.second.push_back(i);
for (auto e : test) { // display them
cout << e.first << ":" << endl;
for (auto f : e.second)
cout << f << endl;
}
vector <int> blank; // test modifying a value
test["GAS"] = blank;
for (auto e : test["GAS"])
cout << e << endl;
cout << "hopefully empty?" << endl;
}
Я надеюсь, что это не слишком запутанно, как я объяснил или записал это. Заранее благодарим за любую помощь, которая может быть предоставлена.
Всех с Новым годом!
std::map
вместо развертывания собственных.std::map
. - person juanchopanza   schedule 31.12.2017