Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/laravel/10.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++ 迭代器可以指向特定的位置而不是STL集合中的值吗?_C++_C++11_Stl_C++14 - Fatal编程技术网

C++ 迭代器可以指向特定的位置而不是STL集合中的值吗?

C++ 迭代器可以指向特定的位置而不是STL集合中的值吗?,c++,c++11,stl,c++14,C++,C++11,Stl,C++14,它正在打印4,而在我的情况下,我希望总是访问特定位置的元素,比如说st.begin()+3(如果存在),因此问题它指向同一个元素。不一定在集合中与集合排序的位置相同。阅读此处:它指向同一元素。不一定在集合中与集合排序的位置相同。阅读此处:std::set是一个关联容器,因此其元素的位置没有意义。迭代器指向同一个元素,因为std::set::insert不会使迭代器无效。但不能保证这将是第五个元素。若您需要一个固定位置的容器,请使用std::vector或std::list std::set是一个

它正在打印4,而在我的情况下,我希望总是访问特定位置的元素,比如说
st.begin()+3
(如果存在),因此问题它指向同一个元素。不一定在集合中与集合排序的位置相同。阅读此处:

它指向同一元素。不一定在集合中与集合排序的位置相同。阅读此处:

std::set
是一个关联容器,因此其元素的位置没有意义。迭代器指向同一个元素,因为
std::set::insert
不会使迭代器无效。但不能保证这将是第五个元素。若您需要一个固定位置的容器,请使用
std::vector
std::list

std::set
是一个关联容器,因此其元素的位置没有意义。迭代器指向同一个元素,因为
std::set::insert
不会使迭代器无效。但不能保证这将是第五个元素。若您需要一个固定位置的容器,请使用
std::vector
std::list

用黑体字继续提问

是否有任何方法(不必使用迭代器)可以在第5个元素发生更改后(无需再次调用advance())继续获取该元素?


,无法始终访问特定位置。至少有一个编译器将集合实现为树。为了保持搜索、插入等的效率,通常会对树进行重新平衡。代价是插入后不能指望任何元素保持在任何特定位置。

继续以粗体显示问题

是否有任何方法(不必使用迭代器)可以在第5个元素发生更改后(无需再次调用advance())继续获取该元素?



,无法始终访问特定位置。至少有一个编译器将集合实现为树。树经常被重新平衡,以保持搜索、插入等的效率。惩罚是插入后不能指望任何元素保持在任何特定位置。

当您选中时发生了什么?集合实际上没有“位置”,这可能与它们的实现方式有关。你能澄清一下你的意思吗?@juanchopanza它似乎总是指向旧的value@JohnPerry是的,我知道这不是随机访问。但在我的例子中,我必须使用STL集合访问指定“位置”的元素…@juanchopanza我想我的问题是“如果它指向旧值,那么是否仍有实现我期望的行为”,我是否遗漏了什么?检查时发生了什么?集合实际上没有“位置”这可能与它们的实现方式有关。你能澄清一下你的意思吗?@juanchopanza它似乎总是指向旧的value@JohnPerry是的,我知道这不是随机访问。但在我的例子中,我必须使用STL集访问指定“位置”的元素…@juanchopanza我想我的问题是“如果它指向旧值,那么是否仍然可以实现我想要的行为”,我是否遗漏了什么?谢谢..我实际上使用的是std:list,但在我的例子中,流式输入需要保持排序,所以我用std:multiset代替。。。(OP使用set以简化操作)您可以使用
std::sort
对列表进行排序。这太慢了,因为不能在每次新整数出现时调用sort()。@shole您可以在插入元素时对向量执行二进制搜索。这既能保持它的有序性,又能让你快速移动。如果不知道你的应用程序的细节,很难判断。也许您可以将数据缓冲一段时间,然后对其进行排序,或者在输出到算法之前进行排序,这需要排序。谢谢..实际上我使用的是std:list,但在我的情况下,流式输入需要保持排序,因此我使用std:multiset代替。。。(OP使用set以简化操作)您可以使用
std::sort
对列表进行排序。这太慢了,因为不能在每次新整数出现时调用sort()。@shole您可以在插入元素时对向量执行二进制搜索。这既能保持它的有序性,又能让你快速移动。如果不知道你的应用程序的细节,很难判断。也许您可以将数据缓冲一段时间,然后对其进行排序,或者在输出到算法之前进行排序,这需要排序。
set<int> st;
set<int>::iterator it;

for(int i=10; i<20;i++)
    st.insert(i);

it = st.begin();
advance(it, 4); // it points to the 5th element which is 14

for(int i=0; i<10; i++)
    st.insert(i);

// At this point where does it points to? The 5th element which is 4, 
// or the old element having value 14?
st.insert(4);
it = st.begin();
st.insert(3);
st.insert(2);
cout << *it << endl;