【问题标题】:the most efficient and fastest way to compare elements in a vector?比较向量中元素的最有效和最快的方法?
【发布时间】:2012-11-16 18:04:21
【问题描述】:

使用两个迭代器比较类向量中元素的最有效和最快的方法是什么?向量不是可排序的,我有一个重载的 ">" 类的运算符。我使用 boost foreach 进行简单的向量迭代。

我正在做与下面给出的类似的事情。

vector<TestClass*> vec; 
vector<TestClass*>::iterator jIter;     
bool isErased=false;
vector<TestClass*>::iterator iIter = vec.begin();
if(!vec.empty()){
    while(iIter < vec.end()-1) {            
        isErased = false;
        for (jIter = iIter+1; jIter < vec.end();jIter++) {          
            if((*(*iIter))<=(*(*jIter))) {
                delete *jIter;
                jIter = vec.erase(jIter);               
                jIter--;
            }               
            else if((*(*iIter))>=(*(*jIter))) {                 
                delete *iIter;
                iIter = vec.erase(iIter);
                isErased = true;
                break;
            }               
        }
        if(!isErased) iIter++;
    }               

谢谢。

【问题讨论】:

  • 这段代码应该做什么?
  • 如果我不得不猜测,我会说 OP 正在尝试查看向量中的每个元素是否与 任何 其他元素匹配,并删除那些只存在一次的元素。跨度>
  • 做某事最有效、最快的方法就是不做。如果你用向量做的事情很慢,不要使用向量。至于查找数组的最大元素,使用 std::max_element(vec.begin(), vec.end());
  • 鉴于目前的形式无法准确确定 OP 希望达到的目标,我不明白为什么这个问题会吸引投票。
  • 为什么不能排序?你为什么使用vector?如果你想要唯一性,那么你应该使用一个提供它的容器(比如setmap,或者至少是一个sorted vector

标签: c++ boost vector iterator


【解决方案1】:

最棘手的部分是避免遇到无效的迭代器:

v.erase(std::remove_if(v.begin(), v.end(), [j](T const &i) { return i > j; });

也可以使用循环,但在这种情况下使用反向迭代器

PS:我无法理解你实际上想要在你的算法中实现什么

你可能感兴趣

【讨论】:

  • @111111 我澄清了我对算法要求的不理解
【解决方案2】:

未经测试,但类似这样。

 for(auto it=vec.begin(), end=vec.end(); it!=end; ++it) {
   const auto&& val=*it;
   std::size_t count=0u;
   end=std::remove_if(
       it, end,
       [&](const TestClass& tc) -> bool {
           if(tc==val) ++count;
           return (count > 1);
       }
   );
 }
 vec.erase(end, vec.end());

【讨论】:

  • 据我所知,这并没有像 OP 的样本在各个方面所做的那样。 (我不怪你,我真的无法理解它试图实现自己的目标)
  • @sehe,哈哈,据我所知,他想删除重复项,而不对容器进行排序,我不知道为什么当他可以变异时他不能排序。 (注意我只是做了一些编辑,这更有意义)。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2019-12-30
  • 1970-01-01
  • 2019-09-06
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-01-15
相关资源
最近更新 更多