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不是引用,而是元素的新副本?
谢谢(代码可能有错别字,我是在手机上写的……)
Run Code Online (Sandbox Code Playgroud)for (auto v : m_vect) v.push_back(m_default);
在上面的形式中,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 的答案很有趣。