gpt4 book ai didi

c++ - 类列表的 vector 中的值不被修改

转载 作者:太空宇宙 更新时间:2023-11-04 13:19:16 25 4
gpt4 key购买 nike

我是使用 C++ STL 的初学者,最近才开始使用 Vectors。我正在尝试构建类对象列表的类型 vector 的数据结构。

我发现每当我尝试对我的类对象变量进行更改时,更改都会按照需要写入。但是,如果我读回相同的类变量,它们会返回以前的值。

这是我的代码的简化版本,它首先将所有 bool 变量值初始化为“0”。

然后,我对所有 bool 值取反并观察到变量在反转后获得值“1”。

但是,当我再次显示我的列表时,我看到它们回到“0”。

这是我用过的一段代码:

#include <iostream>
#include <vector>
#include <list>
using namespace std;

class edge{
private:
bool _id;

public:
void invert_id()
{
_id = !_id;
}

bool get_id()
{
return _id;
}

edge(bool id) //Constructor
{
_id = id;
}
};

void display_list(vector<list<edge> > &adjList);
void negate_list(vector<list<edge> > &adjList);

int main() {

vector<list<edge> > adjList(2);

adjList[0].push_back(edge(false));
adjList[0].push_back(edge(false));
adjList[1].push_back(edge(false));
adjList[1].push_back(edge(false));
adjList[1].push_back(edge(false));

cout<<endl <<"Original List-->" <<endl;
display_list(adjList);

cout<<endl <<"Inverted List-->" <<endl;
negate_list(adjList);

cout<<endl <<"List After Inversion-->" <<endl;
display_list(adjList);
}

以下是我编写的具有通过引用传递 vector 的函数:

void display_list(vector<list<edge> > &adjList)
{
int c=0;
for (vector<list<edge> >::iterator i=adjList.begin(); i !=adjList.end(); ++i)
{
cout<<"AdjList["<< c<<"] IDs =";
list<edge> li = *i;

for(list<edge>::iterator iter = li.begin(); iter!= li.end(); ++iter)
{
cout<<" "<<(*iter).get_id();
}
cout<<endl;
c++;
}
}

void negate_list(vector<list<edge> > &adjList)
{
int c=0;
for (vector<list<edge> >::iterator i=adjList.begin(); i !=adjList.end(); ++i)
{
cout<<"AdjList["<< c<<"] IDs =";
list<edge> li = *i;

for(list<edge>::iterator iter = li.begin(); iter!= li.end(); ++iter)
{
(*iter).invert_id();
cout<<" "<<(*iter).get_id();
}
cout<<endl;
c++;
}
}

我得到的输出是:

Original List-->
AdjList[0] IDs = 0 0
AdjList[1] IDs = 0 0 0

Inverted List-->
AdjList[0] IDs = 1 1
AdjList[1] IDs = 1 1 1

List After Inversion-->
AdjList[0] IDs = 0 0
AdjList[1] IDs = 0 0 0

如上所示,我无法理解为什么即使将值更新为“1”后,这些值仍会恢复为“0”。

我在这里遗漏了什么吗?

最佳答案

list<edge> li = *i;

这是 std::list深拷贝。您对此 std::list 所做的任何更改都不会影响原始的。

这应该可以解决您的问题:

void negate_list(vector<list<edge> > &adjList){
int c=0;
for (auto i=adjList.begin(); i !=adjList.end(); ++i){
cout<<"AdjList["<< c<<"] IDs =";
for(auto iter = i->begin(); iter!= i->end(); ++iter){
(*iter).invert_id();
cout<<" "<<(*iter).get_id();
}
cout<<endl;
c++;
}
}

关于c++ - 类列表的 vector 中的值不被修改,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35933759/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com