C ++访问类内容器的开始()/结束()方法[重复]

Posted

技术标签:

【中文标题】C ++访问类内容器的开始()/结束()方法[重复]【英文标题】:C++ Accessing to begin()/end() methods of container inside a class [duplicate] 【发布时间】:2016-01-08 10:45:08 【问题描述】:

我想在一个类中访问容器的 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 的向量?这是通过迭代器访问类内容器的好方法吗?

谢谢。

【问题讨论】:

如果在 for 循环中将 listspec.getVett() 更改为 pVet 会发生什么? @immibis 它可以工作,但我添加 pVet 只是为了调试。我不想将从 getVett() 返回的整个容器保存在另一个向量中,而只是使用迭代器来处理它。这就是为什么我想写这样的东西:listspec.getVett().begin()listspec.getVett().end() @bolov 是的,分心了,之前没能投票。现在都处理好了。 @AlgirdasPreidžius 我认为这个问题并不能完全回答这个问题。事实上,它并没有讨论向量的一部分如何可能在这里以正确的方式打印,而部分则不是。 【参考方案1】:

您的函数std::vector&lt;int&gt; getVett(void) const return vettore; 创建了您的向量vettore 的副本。您必须返回对您的向量的引用。因此,您的 for 循环中的行为不明确。像这样改变你的功能:

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

由于您的函数是const,而您的返回引用是const,您必须在for 循环中使用const_iteratorcbegincend

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;

【讨论】:

感谢您的回答。有没有办法在 C++03 中实现同样的功能? @hawake 除了auto,这个答案的哪一部分在 C++03 中不起作用? @immibis C++03 不支持 cbegin() 和 cend()。 @hawake 不要 begin() 和 end() 为 const 对象(或引用)返回 const_iterators? @hawake ...所以将it1 设为...::const_iterator 而不是...::iterator

以上是关于C ++访问类内容器的开始()/结束()方法[重复]的主要内容,如果未能解决你的问题,请参考以下文章

c ++:将指针传递给基类时访问派生类方法?

C ++ - 结构与类[重复]

方法重写

类加载器的作用

Python:迭代器的简单理解

PHP面向对象之抽象类