Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;将索引绑定到一个数据结构_C++_Templates_Map_Indexing_Type Safety - Fatal编程技术网

C++ C++;将索引绑定到一个数据结构

C++ C++;将索引绑定到一个数据结构,c++,templates,map,indexing,type-safety,C++,Templates,Map,Indexing,Type Safety,假设我有两个元素容器: std::vector<std::string> foo = { "aa", "bb", "cc" }; std::vector<std::string> bar = { "dd", "ee" }; 是否有一种简单的设计模式可以帮助防止我试图通过将id\u foo绑定到foo来调用bar[id\u foo] 基本上,我试图找出消除foo和bar之间歧义的最简单方法。我可以为每个类创建单独的类,然后在这些类中定义迭代器。但是我希望避免为每个容器创建

假设我有两个元素容器:

std::vector<std::string> foo = { "aa", "bb", "cc" };
std::vector<std::string> bar = { "dd", "ee" };
是否有一种简单的设计模式可以帮助防止我试图通过将
id\u foo
绑定到
foo
来调用
bar[id\u foo]

基本上,我试图找出消除
foo
bar
之间歧义的最简单方法。我可以为每个类创建单独的类,然后在这些类中定义迭代器。但是我希望避免为每个容器创建单独的类,比如
foo
bar
,我希望这些容器具有这种“安全性”


问题是要求像“索引安全性”(类似于类型安全性)这样的东西。我目前实现这一点的方法是,以某种方式命名索引,以指示它们与哪个容器关联。

无需设置不同的类,只需使用迭代器而不是索引。它将转到适当的元素,因为它已经知道要查看哪个容器(如果需要)。

实际上没有一种设计模式来区分索引索引的内容。有一些惯例

您可以使用typedef来区分它们。也就是说,将
int
类型定义为
foodindex
,类似地,将
BarIndex
类型定义为
foodindex。你也可以用一些匈牙利符号来表示名字(我知道人们讨厌这个,但这类东西就是它的本意)。您似乎已经在使用其中的一些功能,但不是以一种有用的方式。考虑这个命名约定:

int fooCurrentKey = 1;
int barCurrentKey = 0;

这让您知道,第一个索引用于list
foo
,第二个索引用于list
bar

您能够使用标准STL迭代器而不是索引吗?是的,标准STL迭代器也可以,但是我如何检查迭代器与哪个容器相关联呢?关于迭代器与索引,需要记住的一点是,如果OP增长了容器,迭代器将无效,而索引不会。但是除了这一小点之外,使用
std::advance
std::difference
你可以用迭代器做所有你以前可以用索引做的事情。@Javier,我如何检查迭代器与哪个容器相关?而且,@Lambdageek提出的问题对我来说是至关重要的。如果容器增长,迭代器是否仍然有效?并非所有迭代器都允许它(因为原始指针是原始数组的有效迭代器);但是您可以:a)不必在意,只要引用迭代器,就可以访问元素;b)如果您使用特定的容器,就可以获得特定的迭代器类,这些类可能实现所需的调用。或者c)不要传递迭代器,传递同时包含迭代器和容器引用的对象。在大多数情况下,选项A是最好的,但您可能需要重新考虑访问元素的方式。例如,大多数STL算法不接受容器,只接受开始/结束迭代器对。@Lex Fridman:你不接受;大多数(如果不是所有的话)发布模式迭代器都不知道它们连接到什么容器。调试模式只知道帮助调试代码。使用迭代器来区分这些是错误的建议,所以-1.谢谢,Nicol。哈维尔在上面提到了一些有趣的观点,但他们确实错过了我要问的事情,我相信从你的评论和回答中,你已经明白了。谢谢你的帮助。很高兴看到这么多才华横溢的人加入我们的团队。顺便说一下,我确实使用了匈牙利符号的变体,但更喜欢用下划线分隔类型说明符。
int fooCurrentKey = 1;
int barCurrentKey = 0;