每个循环的 C++ 向量不会迭代引用?

Cha*_*one 3 c++ foreach reference vector pass-by-reference

昨天我花了差不多一个时间来调试这个东西,从那时起我就无法停止思考它。C

我尝试实现带有字符串索引的二维矩阵......

class CSqrMatrix(){
  ....
  void insert(string str){
     bool b = map.insert(str,m_size).second;
     if (b){
         m_size++;
         vector<int> ve;
         for (int i = 0; i < m_vect.size(); i++) 
             ve.push_back(m_default);
         m_vect.push_back(ve);
         for (auto v : m_vect)
             v.push_back(m_default);
     }
  ...
map<string,int> map;
vector < vector<int> > m_vect;
int m_default;
int m_size;
};
Run Code Online (Sandbox Code Playgroud)

经过一些插入后,当我尝试到达类似的元素时

m_vect[0][0] = 8;
Run Code Online (Sandbox Code Playgroud)

我遇到了无效的写入和段错误...并且 的值为m_vect[0].size()0;我尝试了一切,最后我将 for every 循环更改为普通循环,例如

for (int i = 0; i < m_vect.size(); i++){
     m_vect[i].push_back(m_default);
Run Code Online (Sandbox Code Playgroud)

该程序运行良好...

那么这是否意味着,这v不是引用,而是元素的新副本?

谢谢(代码可能有错别字,我是在手机上写的……)

Mr.*_*C64 5

for (auto v : m_vect)
    v.push_back(m_default);
Run Code Online (Sandbox Code Playgroud)

在上面的形式中,range-for 循环使用存储在 中的项目的副本( ) 进行迭代。vm_vect

如果您想直接对中的项目的引用进行操作m_vect,您应该明确这一点,使用auto&

// v references items in m_vect
for (auto& v : m_vect) {
    v.push_back(m_default);
}
Run Code Online (Sandbox Code Playgroud)

您可能会发现StackOverflow 关于使用 C++11 range 的答案很有趣。