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)
位(以及noelse
子句)…但这可能是吹毛求疵:PI不能不发出信号,表明map::insert(value\u type)
返回迭代器,因此您可以在if
块中分配给iter
,并且只有一次->秒。向后推(TagId)
位(和noelse
子句)…但这可能是吹毛求疵:P