创建对矢量的问题

时间:2011-08-11 19:10:34

标签: c++ algorithm stl

我正在尝试创建一个名为Disjoint Set的数据结构。看看理论我的想法是这样的:

std::vector<std::pair<int,std::set<int>>> DisjointSet;
for(auto i=0;i<10;++i) DisjointSet.push_back( std::make_pair(i,std::set<int>().insert(i)));

但是这段代码提供的内容超出了我的理解范围,所以这是制作Disjoint Set的好设计。另外我如何摆脱这些错误?

4 个答案:

答案 0 :(得分:3)

set::insert不会返回集合本身。您需要事先创建该集insert,然后在make_pair中使用它。对于使用move的副本几乎没有开销,这就是诀窍:

std::vector< std::pair<int,std::set<int> > > DisjointSet;
for(auto i=0;i<10;++i) {
  std::set<int> tmp; tmp.insert(i);
  DisjointSet.push_back( std::make_pair(i,std::move(tmp)));
}

答案 1 :(得分:1)

以下代码执行我认为您正在尝试的内容

std::vector< std::pair< int, std::set<int> > > DisjointSet;
for (int i=0; i<10; ++i)
{
  std::set<int> tmp;
  tmp.insert(i);
  DisjointSet.push_back( std::make_pair(i,tmp) );
}

答案 2 :(得分:0)

std::set<int>().insert(i)

不返回std :: set。

尝试分几行:

for(int i=0;i<10;++i) {
    DisjointSet.push_back( std::make_pair(i,std::set<int>()) );
    DisjointSet.back().insert(i);
}

答案 3 :(得分:0)

你有一个insert的调用是没有意义的(因为它没有返回集合)。所以

std::vector<std::pair<int,std::set<int>>> DisjointSet;
for(auto i=0;i<10;++i)
    DisjointSet.push_back( std::make_pair(i,std::set<int>().insert(i)));

应该真的像

那样
std::vector<std::pair<int,std::set<int>>> DisjointSet;
std::set<int> temp;

for(auto i=0;i<10;++i)
{
    temp.insert(i)
    DisjointSet.push_back( std::make_pair(i,temp) );
    temp.clear();
}

稍微冗长一点,但它是正确的。