C++ 将结构的地址分配给另一个结构的指针
我正在创建结构并将它们推到两个向量。在创建这些结构的同时,我还使用下限函数对它们进行排序。第一个结构按名称排序,第二个结构按ID排序 该函数如下所示:C++ 将结构的地址分配给另一个结构的指针,c++,pointers,structure,C++,Pointers,Structure,我正在创建结构并将它们推到两个向量。在创建这些结构的同时,我还使用下限函数对它们进行排序。第一个结构按名称排序,第二个结构按ID排序 该函数如下所示: bool AddAndSort ( name , ID ) { auto it = lower_bound ( arr_1 . begin (), arr_1 . end (), name, compare2 () ); auto it1 = lower_bound( arr_2 . begin(), arr_2 .end(), ID
bool AddAndSort ( name , ID )
{
auto it = lower_bound ( arr_1 . begin (), arr_1 . end (), name, compare2 () );
auto it1 = lower_bound( arr_2 . begin(), arr_2 .end(), ID , compare1 ( ) );
struct1 tmp1( name ); // create temporary structures which i will push to the vector
struct2 tmp( ID );
arr_1 . insert ( it, tmp );
arr_2 . insert ( it1, tmp1);
/*tmp . p = &tmp1;
tmp1 . p = &tmp;*/
return true;
}
问题是:如何在这两个结构中设置指针
互相指指点点
我试过这个:
tmp . p = &tmp1;
tmp1 . p = &tmp;
但这是行不通的
结构:
struct struct1
{
struct1 ( string name ) : name ( name ) { }
string name
struct2 *p;
};
struct struct2
{
struct2 ( int ID ) : ID ( ID ) { }
int ID;
struct1 *p;
}
向量:
vector<struct1> arr_1
vector<struct2> arr_2
向量arr\u 1
向量arr_2
您可能需要:
auto inserted_it1 = arr_1.insert(it, tmp);
auto inserted_it2 = arr_2.insert(it1, tmp1);
inserted_it1->p = &*inserted_it2;
inserted_it2->p = &*inserted_it1;
但是以前的引用会因insert
而无效,您可能需要:
auto inserted_it1 = arr_1.insert(it, tmp);
auto inserted_it2 = arr_2.insert(it1, tmp1);
inserted_it1->p = &*inserted_it2;
inserted_it2->p = &*inserted_it1;
但是以前的引用会因插入而无效
第一个结构按名称排序,第二个结构按ID排序
检查-它可以完全做到这一点(有多个排序索引)只有一个单一的结构
因为正如所指出的,跨结构保留指针可能容易出错(地址在插入/删除时会发生更改等)。boost::multi_index
可在发动机罩下自动控制发动机
第一个结构按名称排序,第二个结构按ID排序
检查-它可以完全做到这一点(有多个排序索引)只有一个单一的结构
因为正如所指出的,跨结构保留指针可能容易出错(地址在插入/删除时会发生更改等)。
boost::multi_index
可在引擎盖下自动处理该功能。为什么不起作用?你有编译器错误吗<代码>索引在您的结构中不存在,您的意思是p
?对不起,我忘了编辑名称它应该是pOkay,您仍然需要发布编译器错误。另外,std::lower_bound
不会对任何内容进行排序,您的函数签名也不会被编译。我没有任何编译器错误,只是在打印时显示一些未定义的字符和数据。tmp
与向量中的对象不同。当你插入一个副本时,为什么它不起作用?你有编译器错误吗<代码>索引在您的结构中不存在,您的意思是p
?对不起,我忘了编辑名称它应该是pOkay,您仍然需要发布编译器错误。另外,std::lower_bound
不会对任何内容进行排序,您的函数签名也不会被编译。我没有任何编译器错误,只是在打印时显示一些未定义的字符和数据。tmp
与向量中的对象不同。当你插入一个副本时,第一个是什么意思?@kvway:first
用于插入std::map
/std::set
。Removed asstd::vector::insert
直接返回迭代器。它在类方法内部工作,但当我声明另一个方法从另一个结构打印元素时,我得到了(auto const&tmp:arr_2)cout name的seg fault,正如我所说的,这些引用非常脆弱,只要调用两次就会失效。first应该是什么意思?@kvway:first
用于插入std::map
/std::set
。Removed asstd::vector::insert
直接返回迭代器。它在类方法内部工作,但当我声明另一个方法来从另一个结构打印元素时,我得到了seg faultfor(auto const&tmp:arr_2)cout name正如我所说的,这些引用非常脆弱,只要调用两次就失效。