C ++访问类中容器的begin()/ end()方法

时间:2016-01-08 10:45:08

标签: c++ class methods containers

我想在类中访问Container的begin()和end()方法,而不会引发const_iterator到迭代器的转换问题。所以我做了一个get方法来返回容器并访问它:

#include <iostream>
#include <vector>

class SpecialList {
  public:
    std::vector<int> getVett(void) const { return vettore; }

    void getFull(void) {
      std::vector<int>::iterator it1;

      for (size_t i = 0; i < 10; ++i)
        vettore.push_back(i);
    }

    void print(void) {
      std::vector<int>::iterator it1;

      std::cout << std::endl;

      for (it1 = vettore.begin(); it1 != vettore.end(); ++it1)
        std::cout << " " << *it1;

      std::cout << std::endl;
    }

  private:
   char some_data;
   std::vector<int> vettore;
};

int main(void) {
  std::cout << "Some output" << std::endl;

  SpecialList listspec;
  listspec.getFull();
  listspec.print();

  std::vector<int> pVet = listspec.getVett();

  std::cout << "Size = " << pVet.size() << std::endl;
  std::cout << "pVet[1] = " << pVet[1] << std::endl;

  std::vector<int>::iterator it2;

  std::cout << std::endl;

  for (it2 = listspec.getVett().begin(); it2 != listspec.getVett().end(); ++it2)
    std::cout << " " << *it2;

  std::cout << std::endl << "pVet[1] = " << pVet[1] << std::endl;
  return 0;
}

代码从编译器的角度来看,但它输出错误:

  

一些输出

     

0 1 2 3 4 5 6 7 8 9

     

尺寸= 10

     

pVet [1] = 1

     

0 0 2 3 4 5 6 7 8 9

     

pVet [1] = 1

为什么无法正确读取矢量打印0而不是1?这是通过迭代器访问类中容器的好方法吗?

感谢。

1 个答案:

答案 0 :(得分:2)

您的功能std::vector<int> getVett(void) const { return vettore; }会创建矢量vettore的副本。您必须返回对向量的引用。因此,您的for循环中没有未定义的行为。像这样改变你的功能:

const std::vector<int>& getVett(void) const { return vettore; } 

由于您的功能为const而且您的返回引用为const,因此您必须在const_iterator中使用cbegincendfor环。

std::vector<int>::const_iterator it2;
for (it2 = listspec.getVett().cbegin(); it2 != listspec.getVett().cend(); ++it2)
    std::cout << " " << *it2;

注意:您可以使用auto代替const_iterator

for (auto it2 = listspec.getVett().cbegin(); it2 != listspec.getVett().cend(); ++it2)
    std::cout << " " << *it2;

您也可以放弃const

std::vector<int>& getVett(void) { return vettore; } 

std::vector<int>::iterator it2;
for (it2 = listspec.getVett().begin(); it2 != listspec.getVett().end(); ++it2)
    std::cout << " " << *it2;