Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/cplusplus/134.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/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++_Oop_Memory Management_Vector_Indexing - Fatal编程技术网

C++ 在遍历向量时使用什么索引

C++ 在遍历向量时使用什么索引,c++,oop,memory-management,vector,indexing,C++,Oop,Memory Management,Vector,Indexing,好的,我想一劳永逸地澄清一些事情。如果我有一个法向量,比如: std::vector<Object*> coll; 并使用*访问元素 我注意到并听说第三种方法是最防失败的方法,但当涉及到释放向量时,这是非常令人不快的,因为当我使用const_迭代器时,如果我在释放之前执行诸如delete*it,甚至coll.eraseit之类的操作,我的迭代器将失去其值,然后我无法继续for循环 建议/好的方法是什么?前两种方法都不完全正确。正确的索引类型是 std::vector<Obje

好的,我想一劳永逸地澄清一些事情。如果我有一个法向量,比如:

std::vector<Object*> coll;
并使用*访问元素

我注意到并听说第三种方法是最防失败的方法,但当涉及到释放向量时,这是非常令人不快的,因为当我使用const_迭代器时,如果我在释放之前执行诸如delete*it,甚至coll.eraseit之类的操作,我的迭代器将失去其值,然后我无法继续for循环


建议/好的方法是什么?

前两种方法都不完全正确。正确的索引类型是

std::vector<Object*>::size_type
这是回报,也是代价

使用迭代器的方法是惯用的方法。你写的

当我使用const_迭代器时,如果我在释放之前执行诸如delete*it,甚至coll.eraseit之类的操作,我的迭代器将丢失其值,然后我将无法继续for循环

这是不对的。在某种程度上

// ..
std::vector<int *>::const_iterator it, end = v.end();
for ( it = v.begin(); it != end; ++it ) {
    delete *it;
}

您不会使迭代器失效。您只需在迭代器指向的对象上调用delete。因此,您可以在删除后安全地推进迭代器。

前两种方法都不完全正确。正确的索引类型是

std::vector<Object*>::size_type
这是回报,也是代价

使用迭代器的方法是惯用的方法。你写的

当我使用const_迭代器时,如果我在释放之前执行诸如delete*it,甚至coll.eraseit之类的操作,我的迭代器将丢失其值,然后我将无法继续for循环

这是不对的。在某种程度上

// ..
std::vector<int *>::const_iterator it, end = v.end();
for ( it = v.begin(); it != end; ++it ) {
    delete *it;
}
您不会使迭代器失效。您只需在迭代器指向的对象上调用delete。因此,您可以在删除后安全地推进迭代器。

3一个更通用,它使您的代码更灵活。 如果在某个时候需要将标准库容器从std::vector更改为其他容器,则3将按原样适用于其他任何容器。请注意!=与

3相比,它更通用,使代码更灵活。
如果在某个时候需要将标准库容器从std::vector更改为其他容器,则3将按原样适用于其他任何容器。请注意!=而不是

size\t通常是用于索引到数组中的正确类型,因为它基本上被定义为一个足够大的类型,可以容纳对象的最大大小。它实际上定义为内存范围的大小,但也是保存数组索引的最佳类型,这样您就知道它足够大了


在64位系统上,您可能可以拥有填充数百GB内存的数组,但int只能容纳高达20亿左右的数字,而size\u t应该是一种合适的类型,用于索引系统可以处理的任何数组。

size\u t通常是用于索引数组的正确类型,因为它基本上被定义为一种类型它足够大,可以容纳最大尺寸的物体。它实际上定义为内存范围的大小,但也是保存数组索引的最佳类型,这样您就知道它足够大了

在64位系统上,您可能可以拥有占用数百GB内存的数组,但int只能容纳高达20亿左右的数字,而size\u t应该是系统能够处理的任何数组的适当索引类型。

您写道:

…甚至在取消分配之前coll.eraseit,我的迭代器将丢失其 值,然后我无法继续for循环

erase将迭代器返回到集合中的下一个有效元素。 因此,你可以写:

std::vector<Object*>::const_iterator i;
for(i = coll.begin(); i != coll.end(); )
{
  i = coll.erase(i);
}
注意,在这种情况下不能增加i++。

您写道:

…甚至在取消分配之前coll.eraseit,我的迭代器将丢失其 值,然后我无法继续for循环

erase将迭代器返回到集合中的下一个有效元素。 因此,你可以写:

std::vector<Object*>::const_iterator i;
for(i = coll.begin(); i != coll.end(); )
{
  i = coll.erase(i);
}

注意,在这种情况下不能增加i++。

在C++11中,有第四种方法:for Object*obj:coll。。。你也可能想考虑et al.同样,在第三种情况下,例如删除它,实际上并没有使迭代器无效,只是它指向了什么。删除*不应该使迭代器无效,尽管它可能意味着你做了其他错误的事情。你能详细介绍一下你所面临的实际问题吗?5:std::for_eachcoll.begin,coll.end,[]{…};在C++11中有第四种方法:for Object*obj:coll。。。你也可能想考虑et al.同样,在第三种情况下,例如删除它,实际上并没有使迭代器无效,只是它指向了什么。删除*不应该使迭代器无效,尽管它可能意味着你做了其他错误的事情。你能详细介绍一下你所面临的实际问题吗?5:std::for_eachcoll.begin,coll.end,[]{…};然而,如果你需要改变你的容器,很可能你不想要你的exi
sting代码按原样编译——正如Scott Meyers在有效STL的第2项中所说的,当心容器独立代码的幻觉。如果您更改了容器,您可能需要考虑更多。但是,如果您需要更改容器,您可能不希望现有代码按原样编译-请注意容器独立代码的幻觉,正如Scott Meyers在有效STL的第2项中所说。如果你改变你的容器,你可能需要考虑更多。啊,好吧,很好,但是假设我通过一个带int的向量,想要删除所有的奇数元素,我怎么能保留迭代器的值并且仍然删除元素呢?f、 e.为了。。。如果*it%2 coll.eraseit使迭代器无效:那么无论如何,你应该使用erase\u。另外,如果我使用size\u类型,只要我不更改容器,我可以确保它100%工作吗?@Vidak:关于你的第一个问题-请参阅如何从向量中删除元素。关于尺寸类型的问题:是的,你可以信赖它。事实上,该类型甚至可用于其他容器。啊,好吧,太好了,但是假设我通过一个带有int的向量,并且想要删除所有奇数元素,那么我如何保留迭代器的值并仍然删除该元素呢?f、 e.为了。。。如果*it%2 coll.eraseit使迭代器无效:那么无论如何,你应该使用erase\u。另外,如果我使用size\u类型,只要我不更改容器,我可以确保它100%工作吗?@Vidak:关于你的第一个问题-请参阅如何从向量中删除元素。关于尺寸类型的问题:是的,你可以信赖它。事实上,该类型甚至可用于其他容器。是的,但在大多数情况下我想增加I,因为我需要删除多个元素…是的,但在大多数情况下我想增加I,因为我需要删除多个元素…所以对于使用[]或动态创建的普通数组,我应该始终使用size\u t而不是int index?对于较小的程序和较小的对象,这种内存是否效率低下?大小通常被定义为与unsigned int相同,因此它完全相同。不同之处在于,您的代码将可移植到可能错误的平台上。正确的类型是operator[]所期望的类型;由于Vidak使用的是std::vector而不是原始数组,因此这将是std::vector::size_类型,它可能通常是size_t的别名,但仍然是。因此对于使用[]或动态创建的普通数组,我应该始终使用size_t而不是int index?对于较小的程序和较小的对象,这种内存是否效率低下?大小通常被定义为与unsigned int相同,因此它完全相同。不同之处在于,您的代码将可移植到可能错误的平台上。正确的类型是operator[]所期望的类型;由于Vidak使用的是std::vector而不是原始数组,因此这将是std::vector::size_类型,它可能通常是size_t的别名,但仍然是。