C++ C+中向量哈希/映射的自动聚类+;

C++ C+中向量哈希/映射的自动聚类+;,c++,data-structures,hash,map,vector,C++,Data Structures,Hash,Map,Vector,例如,我有以下值: 0 0 0 1 3 2 这些值引用集群ID,其中集群的成员是 向量的索引。因此,我们希望获得这种输出: Cluster 0 -> 0,1,2 Cluster 1 -> 3 Cluster 2 -> 5 Cluster 3 -> 4 我尝试了以下构造,但似乎不起作用: 怎么做 #include <iostream> #include <vector> #include <fstream>

例如,我有以下值:

0 0 0 1 3 2
这些值引用集群ID,其中集群的成员是 向量的索引。因此,我们希望获得这种输出:

Cluster 0 -> 0,1,2
Cluster 1 -> 3
Cluster 2 -> 5
Cluster 3 -> 4
我尝试了以下构造,但似乎不起作用: 怎么做

#include <iostream>      
#include <vector>        
#include <fstream>
#include <sstream>
#include <map>
using namespace std;

int main  ( int arg_count, char *arg_vec[] ) {
    if (arg_count !=2 ) {
        cerr << "expected one argument" << endl;
        return EXIT_FAILURE;      
    }

    string line;
    ifstream myfile (arg_vec[1]);

    map <int, vector <int> > CCTagMap;

    if (myfile.is_open())
    {
        // Skip First Line        
        getline(myfile,line);     

        while (getline(myfile,line) )
        {
            stringstream ss(line);    
            int CcId;
            int TagId = -1;           



            vector <int> Temp;        

            while (ss >> CcId) {      
                TagId++;
                cout << CcId << "-" << TagId <<  endl; 

                # this way to cluster doesn't seem to work
                CCTagMap.insert(make_pair(CcId,Temp.push_back(TagId)));
            }


        }
        myfile.close();
    }
    else  { cout << "Unable to open file\n";} 
    return 0;
}
#包括
#包括
#包括
#包括
#包括
使用名称空间std;
int main(int arg_count,char*arg_vec[]){
如果(参数计数!=2){
cerr CcId){
TagId++;

cout你做错的是每次都重写地图中的向量

而不是:

CCTagMap.insert(make_pair(CcId,Temp.push_back(TagId)));
尝试:

if(CCTagMap.find(CcId)=CCTagMap.end())
{
插入(make_pair(CcId,vector());
}
CCTagMap[CcId]。推回(TagId);
甚至更好

map <int, vector<int> >::iterator iter = CCTagMap.find(CcId);
if ( iter == CCTagMap.end() )
{
    CCTagMap.insert(make_pair(CcId,vector<int>())).first->second.push_back( TagId );
}
else
{
    iter->second.push_back( TagId );
}
迭代器iter=CCTagMap.find(CcId); if(iter==CCTagMap.end()) { CCTagMap.insert(make_pair(CcId,vector()).first->second.push_back(TagId); } 其他的 { 国际热核实验堆->第二次。推回(TagId); }
你做错的是每次都在地图上重写向量

而不是:

CCTagMap.insert(make_pair(CcId,Temp.push_back(TagId)));
尝试:

if(CCTagMap.find(CcId)=CCTagMap.end())
{
插入(make_pair(CcId,vector());
}
CCTagMap[CcId]。推回(TagId);
甚至更好

map <int, vector<int> >::iterator iter = CCTagMap.find(CcId);
if ( iter == CCTagMap.end() )
{
    CCTagMap.insert(make_pair(CcId,vector<int>())).first->second.push_back( TagId );
}
else
{
    iter->second.push_back( TagId );
}
迭代器iter=CCTagMap.find(CcId); if(iter==CCTagMap.end()) { CCTagMap.insert(make_pair(CcId,vector()).first->second.push_back(TagId); } 其他的 { 国际热核实验堆->第二次。推回(TagId); }
每次插入时都会覆盖向量。您可以执行以下操作:

map <int, vector <int> >::iterator iter = CCTagMap.find(CcId);
if(iter == CCTagMap.end())
{
  vector <int> Temp;  
  temp.push_back(TagId);
  CCTagMap[CcId] = temp;
}
else
{
  iter->second.push_back(TagId);
}
迭代器iter=CCTagMap.find(CcId); if(iter==CCTagMap.end()) { 向量温度; 温度推回(TagId); CCTagMap[CcId]=温度; } 其他的 { 国际热核实验堆->第二次。推回(TagId); }
每次插入时都会覆盖向量。您可以执行以下操作:

map <int, vector <int> >::iterator iter = CCTagMap.find(CcId);
if(iter == CCTagMap.end())
{
  vector <int> Temp;  
  temp.push_back(TagId);
  CCTagMap[CcId] = temp;
}
else
{
  iter->second.push_back(TagId);
}
迭代器iter=CCTagMap.find(CcId); if(iter==CCTagMap.end()) { 向量温度; 温度推回(TagId); CCTagMap[CcId]=温度; } 其他的 { 国际热核实验堆->第二次。推回(TagId); }
这如何?请定义以下内容,而不是您的
CCTagMap

std::vector<std::vector<int> > clusters;

这样如何?请定义以下内容,而不是您的
CCTagMap

std::vector<std::vector<int> > clusters;

我想我会发布一个针对性能的解决方案(请记住,您应该始终根据Knuth!尽快尝试优化a,除非我弄错了;)

是的,我真的认为我应该指出这个解决方案

  • 节省一些打字时间
  • 性能更高:只有一个查找,而不是一个查找和一个插入。没有临时的(尽管它们可能会被优化)
  • 惯用的
对于此处发生的情况的分解视图:

std::vector<int>& CcVector = CcTagMap[CcId]; // [1]
CcVector.push_back(TagId);                   // [2]
std::vector&CcVector=CcTagMap[CcId];//[1]
CcVector.push_back(TagId);/[2]
  • map::operator[]
    是一个变异运算符:它返回为此键存储的元素,或者如果不存在,则插入一个新的默认构造元素。然后返回对该元素的引用(无论是否新)
  • 我们将参考用于直接向后推,既美观又干净

  • 我想我会发布一个针对性能的解决方案(请记住,您应该始终根据Knuth!尽快尝试优化a,除非我弄错了;)

    是的,我真的认为我应该指出这个解决方案

    • 节省一些打字时间
    • 性能更高:只有一个查找,而不是一个查找和一个插入。没有临时的(尽管它们可能会被优化)
    • 惯用的
    对于此处发生的情况的分解视图:

    std::vector<int>& CcVector = CcTagMap[CcId]; // [1]
    CcVector.push_back(TagId);                   // [2]
    
    std::vector&CcVector=CcTagMap[CcId];//[1]
    CcVector.push_back(TagId);/[2]
    
  • map::operator[]
    是一个变异运算符:它返回为此键存储的元素,或者如果不存在,则插入一个新的默认构造元素。然后返回对该元素的引用(无论是否新)
  • 我们将参考用于直接向后推,既美观又干净

  • 我忍不住发出信号说,
    map::insert(value\u type)
    返回迭代器,这样您就可以在
    if
    块中分配给
    iter
    ,并且只有一次
    ->秒。push\u back(TagId)
    位(以及no
    else
    子句)…但这可能是吹毛求疵:PI不能不发出信号,表明
    map::insert(value\u type)
    返回迭代器,因此您可以在
    if
    块中分配给
    iter
    ,并且只有一次
    ->秒。向后推(TagId)
    位(和no
    else
    子句)…但这可能是吹毛求疵:P