изменение размера вектора не работает?

У меня есть 3 карты со строкой в ​​качестве ключа и вектором в качестве значения.

std::map<std::string, std::vector<int> >          m_attri;   ///< Attributes of type int
std::map<std::string, std::vector<double> >       m_attrd;   ///< Attributes of type double
std::map<std::string, std::vector<std::string> >  m_attrs;   ///< Attributes of type std::string

У меня есть функция, которая изменяет их размер, называет SetNum ()

void SetNum(size_t n)
{
std::cout << "setting num: " << n << std::endl;
m_num = n;
for (auto attr : m_attri) {
attr.second.resize(n, 0);
std::cout<<attr.second.size();
}
for (auto attr : m_attrd) {
attr.second.resize(n, 0.0);
std::cout<<attr.second.size();
}
for (auto attr : m_attrs) {
attr.second.resize(n, "");
std::cout<<attr.second.size();
}
std::cout<<std::endl;
}

кажется, что все это работает, когда, скажем, setnum (1), я получаю кучу 1 с в качестве вывода.

Теперь проблема заключается здесь, у меня есть еще одна функция под названием Set

template<typename T>
inline void AttributeContainer::Set(size_t node_idx, const std::string& name, T value)
{
std::cout << GetNum() << node_idx << ',' << std::endl;
if( node_idx >= GetNum()){
SetNum(node_idx+1);
}
auto attr_kv = Attributes<T>().find(name);
if (attr_kv != Attributes<T>().end()) {
std::cout<<"Containersize: " << attr_kv->second.size() << ',' << "id:"<< node_idx<< std::endl;
attr_kv->second.at(node_idx) = value;
std::cout<<"ContainersizeDone: " << attr_kv->second.size() << std::endl;
} else {
throw std::runtime_error("AttributeContainer::Set(): attribute not found: " + name);
}
}

Аргумент node_idx равен 0, и вектор найден. Но кажется, что изменение размера не сработало, потому что, хотя я получаю вывод, который подтверждает, что он изменен, я получаю исключение out_of_range из at, а строка выше показывает, что размер равен 0. Теперь это странно, так как я думал, что Я успешно изменил их размер?

0

Решение

В SetNum вы перебираете карту по значению (см. Это сообщение)

Следовательно, вы подаете заявку на изменение размера копии ваших сохраненных векторов.

То, что вы хотите, это использовать авто& :

void SetNum(size_t n)
{
std::cout << "setting num: " << n << std::endl;
m_num = n;
for (auto& attr : m_attri) {
attr.second.resize(n, 0);
std::cout<<attr.second.size();
}
for (auto& attr : m_attrd) {
attr.second.resize(n, 0.0);
std::cout<<attr.second.size();
}
for (auto& attr : m_attrs) {
attr.second.resize(n, "");
std::cout<<attr.second.size();
}
std::cout<<std::endl;
}
4

Другие решения


По вопросам рекламы [email protected]