首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个对象的向量push_back导致一个巨大的向量。

一个对象的向量push_back导致一个巨大的向量。
EN

Stack Overflow用户
提问于 2017-01-18 15:57:51
回答 1查看 274关注 0票数 2

我正在c++中做一个项目,我有一个对象向量,其中我想在现有向量上push_back一个对象。但是,在添加对象之前和之后检查大小时,大小从0到12297829382473034412,这让我非常困惑。下面的代码是addCommodity函数。(我已经创建了一个更小的例子来说明同样的问题,所以跳到"SMALL PROBLEM")

代码语言:javascript
复制
void Instance::addCommodity(std::vector<std::string> & tokens) {
  /*if(tokens.size()!=5){
    std::cerr << "Error in commodity data format"<< std::endl;
    exit(-1);
  }*/
  // size_t so = std::atoi(tokens[1].c_str());
  // size_t si = std::atoi(tokens[2].c_str());
  // size_t demand = std::atoi(tokens[3].c_str());
  // size_t ti = std::atoi(tokens[4].c_str());
  std::cout << "size: " << this->_commodities->size() << "\n"; 

  this->_commodities->push_back(Commodity(1,2,3,4));  // ???

  std::cout << "size: " << this->_commodities->size() << "\n";
}

在这里,我已经注释掉了代码中用于从文件中加载的字符串中读取数据的部分。商品的定义如下:

代码语言:javascript
复制
#include "commodity.h"

Commodity::Commodity(size_t so, size_t si, size_t d, size_t ti):
  _source(so),
  _sink(si),
  _demand(d),
  _maxTime(ti)
{}

Commodity::~Commodity(){}

size_t Commodity::getSource() const{
  return _source;
}

size_t Commodity::getSink() const {
  return _sink;
}

size_t Commodity::getDemand() const {
  return _demand;
}

size_t Commodity::getTime() const {
  return _maxTime;
}

将实例初始化为:

代码语言:javascript
复制
Instance::Instance(std::shared_ptr<Param> p, size_t n):
  _params(p),
  _nNodes(n)
{
  this->_commodities.reset(new std::vector<Commodity>());
  this->_arcs.reset(new std::vector<Arc>());
  }

正如前面提到的,我的问题在于addCommodity代码,当尝试使用push_back时。希望这是足够的代码来识别我所犯的任何愚蠢的错误。我忽略了这个项目的大部分其他代码,因为它似乎对addCommodity函数没有影响。

调用函数时收到的输出是:

代码语言:javascript
复制
size: 0
size: 12297829382473034412

小问题

我没有显示所有代码,而是在main中在向量上运行push_back:

代码语言:javascript
复制
#include <iostream>
#include <memory>
#include <sys/time.h>
#include <vector>


#include "commodity.h"

int main(int argc, char* argv[]){


 std::shared_ptr< std::vector<Commodity>> commodities;

  commodities.reset(new std::vector<Commodity>());

  std::cout << "size: " << commodities->size() << "\n";

  size_t a = 1;
  size_t b = 2;
  size_t c = 3;
  size_t d = 4;

  commodities->emplace_back(Commodity(a,b,c,d));

  std::cout << "size: " << commodities->size() << std::endl;

  return 0;

}

这基本上是相同代码的一个较小的实例。商品cpp和h文件如下:

代码语言:javascript
复制
#include "commodity.h"

Commodity::Commodity(size_t so, size_t si, size_t d, size_t ti):
  _source(so),
  _sink(si),
  _demand(d),
  _maxTime(ti)
{}

Commodity::~Commodity(){}

size_t Commodity::getSource() const{
  return _source;
}

size_t Commodity::getSink() const {
  return _sink;
}

size_t Commodity::getDemand() const {
  return _demand;
}

size_t Commodity::getTime() const {
  return _maxTime;
}

头文件:

代码语言:javascript
复制
#ifndef CG_MCF_COMMODITY_H
#define CG_MCF_COMMODITY_H

#include <stdlib.h>

class Commodity {

 public:

  Commodity(size_t so, size_t si, size_t d, size_t t);

  ~Commodity();

  size_t getSource() const;

  size_t getSink() const;

  size_t getDemand() const;

  size_t getTime() const;

 private:

  size_t _source;

  size_t _sink;

  size_t _demand;

  size_t _maxTime;

};

#endif /*CG_MCF_COMMODITY_H*/

调用函数时收到的输出是:

代码语言:javascript
复制
size: 0
size: 12297829382473034412
EN

回答 1

Stack Overflow用户

发布于 2017-01-20 12:05:54

您的Commodity类违反了0/3/5规则

您的代码(令人费解地)这样做:

代码语言:javascript
复制
commodities->emplace_back(Commodity(a,b,c,d));

这真的很奇怪。想必,您调用emplace_back是为了避免在向量中构造一个独立的Commodity。但是,通过显式地将一个单独的Commodity作为emplace_back的参数来强制这样做。

它调用Commodity的复制构造函数在向量中构造Commodity,作为您显式创建的向量的副本。但Commodity没有。很可能,真正的Commmodity类需要一个,因为它有一个析构函数。

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41723846

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档