矢量调整大小不起作用?

时间:2014-05-17 20:08:04

标签: c++ c++11 vector stdvector outofrangeexception

我有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并找到向量。但似乎调整大小没有用,因为,尽管我得到输出确认它被调整大小,我从at得到一个out_of_range异常,上面的行显示大小为0.现在这很奇怪,因为我以为我成功地调整了它们的大小?

1 个答案:

答案 0 :(得分:4)

在SetNum中,您按值迭代地图(请参阅此post

因此,您正在对存储的矢量的副本应用调整大小。

你想要的是使用auto&amp; :

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;
}