65,204
社区成员




#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
struct Node
{
int value;
Node *parent;
Node(int val)
:value(val), parent(NULL)
{
}
Node(const Node& nd)
{
value = nd.value;
parent = nd.parent;
}
bool operator<(const Node& node)
{
return value < node.value;
}
bool operator==(const Node& node)
{
return value == node.value;
}
void print()
{
cout<<"value:"<<value<<endl;
}
};
static vector<Node> openVec;
void getMinFromOpen(vector<Node> &minVec) //可以排序优化
{
minVec.clear();
Node minNode = *min_element(openVec.begin(), openVec.end());
vector<Node>::iterator it = find(openVec.begin(), openVec.end(), minNode);
while(it != openVec.end())
{
if(it->parent)
{
it->parent->print();
}
minVec.push_back(*it);
openVec.erase(it);
it = find(openVec.begin(), openVec.end(), minNode);
}
}
void step( Node &cur,vector<Node> &subNode)
{
int valueOffset[] = {8, 2, 5};
for(size_t i = 0; i < sizeof(valueOffset) / sizeof(valueOffset[0]); i++)
{
Node node(cur.value + valueOffset[i]);
node.parent = &cur;
subNode.push_back(node);
}
}
int _tmain(int argc, _TCHAR* argv[])
{
Node n1(1);
openVec.push_back(n1);
vector<Node> minVec;
vector<Node> subNodes;
getMinFromOpen(minVec);
Node node = minVec[0]; //node对象在main结束时才会被析构
step(node,subNodes);
for(vector<Node>::iterator is = subNodes.begin(); is != subNodes.end(); is++)
{
openVec.push_back(*is);
}
getMinFromOpen(minVec);
return 0;
}
见 《c++ primer》315页 向容器中添加和删除元素的操作可能是指向容器的迭代起,指针,引用失效
一个失效的指针,引用,迭代器将不在表示任何元素。