C ++将迭代器返回给两个或更多类容器

时间:2016-06-28 08:14:55

标签: c++

我正在构建一个C ++ API,仅用于学习目的,我需要一个类 有两个容器。假设它们最初是类型vector<>。

    <?php
$servername = "xxx";
$username = "xxx";
$password = "xxx";
$dbname = "registers";
$con = new mysqli($servername, $username, $password, $dbname);
 $user_name = $_POST["cphone"];  
 $sql_query = "select id from users where phone like '$user_name';";  
 $result = mysqli_query($con,$sql_query);  
 if(mysqli_num_rows($result) >0 )  
 {  
 $row = mysqli_fetch_assoc($result);  
 $name =$row["id"];   
 echo "$name";
 }  
 else  
 {   
 echo "+";  
 }  
 ?>  

但如果有一天我必须更改这些容器的类型(例如列表),我不希望此API的用户需要更改其代码中的任何内容。

因此,考虑到containerA和containerB类型已更改,当使用上面的getter,返回向量&lt;&gt;时,API用户需要更改其代码以匹配新类型的API容器。

我认为返回迭代器而不是vector&lt;&gt;可以帮助我。

class MyClass
{
  private:
    std::vector<int> containerA;
    std::vector<double> containerB;

  public:
    std::vector<int> *getContainerA();
    std::vector<double> *getContainerB();
};

这是事情的方式吗?有没有更好的办法?谢谢。

2 个答案:

答案 0 :(得分:1)

而是使用像

这样的getter
 const std::vector<int>& getContainerA() const { return containerA; }

让您的客户使用

 std::vector<int>::const_iterator

来自参考文献。

  

但如果有一天我必须更改这些容器的类型(例如列表),我不希望此API的用户需要更改其代码中的任何内容。

您还可以使用特定类typedef来公开基础容器类型:

 typedef std::vector<int> ContainerAType;


 const ContainerAType& getContainerA() const { return containerA; }

请注意,分发迭代器是不好的,因为在更改底层容器时这些迭代器可能会变得无效。

如果客户应该收到有关更改的通知,那么您需要一个单独的机制,例如: Observer

答案 1 :(得分:1)

我建议结合πάνταῥεῖ的想法和你的:两者都定义一个类型别名,并返回迭代器:

typedef std::vector<int> ContainerAType;
ContainerAType::iterator beginContainerA();

此外,您还需要一个const版本,以便可以在const实例上使用迭代器:

ContainerAType::const_iterator beginContainerA() const;

考虑是否需要非常规访问。

考虑返回一系列迭代器:

boost::iterator_range<ContainerAType::iterator> containerA();

但是,要真正保护客户端免受任何更改,您需要使用类型擦除迭代器。使用类型擦除,客户端甚至不需要重新编译,如果您从矢量更改为列表(但您还必须使用pimpl模式,以实现这一点)。您甚至可以完全停止使用容器,并返回生成数据的自定义迭代器。

Boost让你了解到:http://www.boost.org/doc/libs/1_54_0/libs/range/doc/html/range/reference/ranges/any_range.html由于在内部使用虚函数调用,类型擦除迭代器确实有一些开销。