我注意到修改(或替换)大型向量中的元素会在向量变大时耗费大量时间,即使元素在向量中的位置已知。
对此有解释吗?
我使用未排序的集合作为索引。代码首先尝试使用set.find()查找集合中的元素。如果元素不存在于集合中,则代码将其插入集合的末尾,同时将其推送到向量的末尾。 如果在集合的位置“x”上找到元素,则使用以下代码替换向量中的数据:
vector.at(x)=vector[x]+element.
当我跳过矢量部分并且只在集合中插入元素时,代码可以在不到2分钟内轻松处理9500万个元素。但是当我向它添加矢量部分时,代码会持续运行几个小时。
我导入的文件是一个以分号分隔的文本,结构如下
2161182;Jutfaseweg;footway;no;7740068,13877901
2953564;Timorkade;cycleway;no;7785429,368846814,582743212,582743202,582743213,582743203,582743214,582743206,582743210,45200603
每一行代表一种方式。最后一个元素中的ID是该特定方式的路径。每个元素都有一个右手邻居,除非它是路的最后一个元素并且基于第四个元素(“是”或“否”,意思是单向或不是),也是一个左手邻居,除非它是第一个元素。方式。
以下是所要求的代码
#include <windows.h>
#include <cstring>
#include <fstream>
#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
#include <cstring>
#include <cstdint>
#include <cstdio>
#include <set>
#include <vector>
using namespace std;
set<string>PresentStreet;
set<int>PresentNode;
vector<string>NeighBours;
string line1;
void split(const string& s, char c,
vector<string>& v) {
string::size_type i = 0;
string::size_type j = s.find(c);
while (j != string::npos) {
v.push_back(s.substr(i, j-i));
i = ++j;
j = s.find(c, j);
if (j == string::npos)
v.push_back(s.substr(i, s.length()));
}
}
int main(int argc, char *argv[]) {
ifstream myfile ("filename.txt");
int CounterLine=1;
while ( getline (myfile,line1) ) {
string s1=line1;
vector<string> v1;
split(line1, ';', v1);
PresentStreet.insert(v1[2]);
vector<string> v2;
split(v1[4], ',', v2);
for (int t=0;t<v2.size();t++) {
auto search = PresentNode.find(atoi(v2[t].c_str()));
if(search == PresentNode.end()) {
string Neighbours="";
if(v1[3].find("no")!=std::string::npos&&t>0) {
Neighbours=Neighbours+v2[t-1]+",";
}
if(t<v2.size()-1) {
Neighbours=Neighbours+v2[t+1]+",";
}
stringstream ss;
ss<<CounterLine;
stringstream ss2;
ss2<<v2[t];
PresentNode.insert(atoi(v2[t].c_str()));
NeighBours.push_back(Neighbours);
}else{
int nPosition = distance (PresentNode.begin (), search);
string Neighbours=NeighBours[nPosition];
if(v1[3].find("no")!=std::string::npos&&t>0) {
Neighbours=Neighbours+v2[t-1]+",";
}
if(t<v2.size()-1) {
Neighbours=Neighbours+v2[t+1]+",";
}
NeighBours.at(nPosition)=Neighbours;
}
}CounterLine++;
}
}