【问题标题】:how can i clean correctly struct containing vector c++?如何正确清理包含向量 c++ 的结构?
【发布时间】:2016-03-27 18:00:59
【问题描述】:

我是 C++ 的初学者。我遇到了清理包含向量的结构的问题;

这是我的结构:

namespace std {

struct EvalItem {
    unsigned int _c; // client
    unsigned int _t; // tour
    unsigned int _p; // position
    unsigned int _dem;
    vector<unsigned int> _deltatScenario; // difference in travel length

    EvalItem(const unsigned int & c, const unsigned int & t, const unsigned int & p,
                 const unsigned int & dem)
                 :_c(c), _t(t), _p(p),_dem(dem){};


};

现在,在某些函数中我使用这个结构;像这样:

void function1()
{
  vector<EvalItem> best;
   ......
   .....
   ......
while(client.size()>0
{
............
...........

    if(best.size()==0)
     {
        best.clear();
      best.push_back(eval);

    }else if(this->_problem->better(eval._deltatScenario,best[0]._deltatScenario)){

        best.clear();
        best.push_back(eval);
    }else if(eval._deltatScenario==best[0]._deltatScenario){
      best.push_back(eval);

        }
    }
}
 }

在“while”的第一次迭代中它工作,我的 best 具有正确的值,但在第二次迭代中,如果程序 clean 我的结构来放置新值,这不起作用,我有一个空的 best

我放图片来解释更多这种情况:

第一次迭代: 我有最好的价值观

但是在第二次迭代中,当程序清理我最好的新值时,我最好有这样的空行:

我不知道是什么问题,你能帮帮我吗??!!

【问题讨论】:

  • 请不要在标准命名空间中添加用户代码
  • 谢谢你的评论,但是为什么?
  • @Mouaici_Med 因为它使您的程序格式错误。
  • @Mouaici_Med 您正在使用调试器,但为什么不单步执行您的程序、查看变量、检查程序流程等?
  • @PaulMcKenzie,我做到了,但是我不知道为什么当我清理“最佳”以放置新值时,我遇到了这个问题,所有变量都可以正常工作,但是当我“最好”时清理它以赋予新价值,我有问题

标签: c++ vector struct


【解决方案1】:

首先,不要把你的代码放在namespace std,那样可能会导致不好的后果。

其次,名称不要以单下划线开头,它可能是一个宏,你甚至都不知道发生了什么。

关于std::vector:Vector 以指数方式分配内存,一种实现可能是它分配的内存是分配前分配的内存的两倍(如 1、2、4、8、16...)。如果你 - 在某个时候 - 在你的向量中有 1000 个元素,然后清除它,分配的内存仍然存在,例如在clear() 之后仍然为 1024 个对象分配空间。如果您想释放该内存,您可以调用shrink_to_fit,或者为现有的分配一个新的空向量:

std::vector<int> vec;
std::cout << vec.capacity() << std::endl; //0

for(size_t i=0; i<1000; ++i)
    vec.push_back(0);
std::cout << vec.capacity() << std::endl; //1024

vec.clear();
std::cout << vec.capacity() << std::endl; //1024

vec.shrink_to_fit();
std::cout << vec.capacity() << std::endl; //0

for(size_t i=0; i<2000; ++i)
    vec.push_back(0);
std::cout << vec.capacity() << std::endl; //2048

vec = std::vector<int>();
std::cout << vec.capacity() << std::endl; //0

【讨论】:

  • 感谢您的回复,但我没有找到函数 shrink_to_fit();
  • shrink_to_fit 是 c++11
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-09-26
  • 1970-01-01
  • 1970-01-01
  • 2023-02-08
  • 1970-01-01
相关资源
最近更新 更多