每个循环的 C++ 向量不遍历引用?
c++ vector for each loop doesn't iterate through references?
昨天我花了将近一个时间来调试这个东西,从那时起我就无法停止思考它。C
我尝试实现一个带有字符串索引的 2D 矩阵......
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;
};
经过一些插入,当我试图到达类似的元素时
m_vect[0][0] = 8;
我得到了无效的写入和段错误...m_vect[0].size()
的值为 0;我尝试了所有方法,最后我将每个循环更改为普通循环,例如
for (int i = 0; i < m_vect.size(); i++){
m_vect[i].push_back(m_default);
该计划运行良好...
那么这是否意味着,v
不是引用,而是元素的新副本?
谢谢(代码中可能有错别字,我在电话里写的...
for (auto v : m_vect) v.push_back(m_default);
在上述形式中,范围循环使用存储在m_vect
中的项目的副本(v
)进行迭代。
如果你想直接对m_vect
中的项目的引用进行操作,你应该明确这一点,使用 auto&
:
// v references items in m_vect
for (auto& v : m_vect) {
v.push_back(m_default);
}
您可能会发现这个 StackOverflow 答案在使用 C++11 范围很有趣。
代码:
for (auto v : m_vect)
v.push_back(m_default);
等效于以下内容(请参阅C++标准 [stmt.ranged]):
{
auto && __range = (m_vect);
for (auto __begin = __range.begin(), __end = __range.end(); __begin != __end; ++__begin)
{
auto v = *__begin; // <-- new copy in each iteration
v.push_back(m_default); // add item to the copy
// the copy goes out of scope
}
}
所以,是的,v
不是裁判,而是每次迭代中的新副本?
你想要的是:
for (auto& v : m_vect)
v.push_back(m_default);
这相当于:
{
auto && __range = (m_vect);
for (auto __begin = __range.begin(), __end = __range.end(); __begin != __end; ++__begin)
{
auto& v = *__begin; // <-- new reference in each iteration
v.push_back(m_default);
}
}
是的v
确实是一个副本。你应该这样做:
for (auto& v : m_vect){
v.push_back(m_default);
}
请记住,std::vector
副本是容器和所有项目的深层副本,这确实是一项昂贵的操作。因此,如果你想在不编辑的情况下传递向量(std::vector<std::vector<T>>
),你应该通过ref传递(如果你不想编辑,则用const
):
for(/*const*/ auto& v:vectors){
//...
}
相关文章:
- 有什么方法可以遍历结构吗
- 在循环中按顺序遍历成员变量
- 遍历模板参数
- 在遍历处理程序的向量时注册和注销处理程序
- C++RapidXml-使用first_node()遍历以修改XML文件中节点的值
- 遍历并行数组以确定C++中的最大数字
- 遍历顺序由 std::文件系统directory_iterator给出
- 遍历链表时的无限循环
- 遍历unordered_map向量
- 从预序遍历构造 bst 的 c++ 和 python 解决方案之间的区别
- C++声明双链表,使用两个 for 循环双向遍历列表并打印
- 如何正确地推回然后遍历堆中对象的向量?
- 遍历二维数组的所有子数组
- 遍历仅引用每个节点的子节点的树
- 使用引用遍历链接列表不起作用
- 遍历对类成员的引用,简单且最好是可重用的
- 每个循环的 C++ 向量不遍历引用?
- 使用引用的数组 (C++) 遍历类成员
- 通过引用C++中的基类来循环遍历派生类
- 通过引用遍历节点的惯用方法