为什么替换向量的元素这么慢?

时间:2015-09-25 18:06:00

标签: c++ c++11

我注意到修改(或替换)大型向量中的元素会在向量变大时耗费大量时间,即使元素在向量中的位置已知。

对此有解释吗?

我使用未排序的集合作为索引。代码首先尝试使用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++;
  }
}

0 个答案:

没有答案