C++ STL Vectors: Get iterator from index?
所以,我编写了一组代码,通过index[]访问STL向量中的元素,但现在我只需要复制向量的一部分。看起来vector.insert(pos, first, last)是我想要的功能…但我只有第一个和最后一个。有没有什么好方法可以让迭代器得到这些值?
- 另请参阅:stackoverflow.com/q/2152986/365102
试试这个:
1
| vector<Type>::iterator nth = v.begin() + index; |
- 通常,可以对STL迭代器使用与指针相同的算法。当使用STL算法时,它们被设计为可交换的。
- @文森特洛伯特:换个方向。指针是STL随机迭代器(最强大的类别)的有效实现。但其他功能较弱的类别(如前向迭代器)不支持相同的算法。
- 我不想在这个答案上加上我的5美分,并推荐std::next(v.begin(), index)。
通过上述方式( v.begin() + index )酒店@ dirkgently几乎为载体
但std::advance( v.begin(), index )最通用的方式和随机存取iterators工程常数时间的价值。
编辑使用的差异:
1
| std::vector<>::iterator it = ( v.begin() + index ); |
或
1 2
| std::vector<>::iterator it = v.begin();
std::advance( it, index ); |
添加后litb Notes"。
- std::advance不需要一个非常量迭代器作为第一个参数吗?
- 根据此-sgi.com/tech/stl/advance.html-否。
- 可以将std::advance与const和non const迭代器一起使用
- bb,你链接的那个页面说它需要一个非常量引用。所以最好是vector:迭代器it=v.begin();advance(it,index);而不是
- 你在哪里看到这个要求?
- 我的措辞不清楚。我的意思是它有一个非常量引用作为参数。所以它需要lvalues作为参数。
- 对。将复制迭代器。但这通常不是问题。
- @goldpseudo:在我的来自VC 2008的STL上,下一个代码编译时没有错误。std::vector:const_iterator it=v.begin();std::advance(it,5);
- bb,请参见:templatevoid f(t&;);f(1);/*bug,does not compile*/。您需要一个f(1);或者只说int x;f(x);
- 在这方面,你不应该信任MSVC。它有一个非标准的扩展,使它接受这种东西,但是所有其他编译器行为标准并拒绝它。
- 是的,我同意,MSVC编译-是快速检查。关于你所说的:它适用于const_迭代器,也适用于迭代器(通过我的链接和标准),并且它支持非const引用,因为它会改变这个引用。
- 我认为问题在于对"const"的含义的混淆:advance()可以很好地处理const-iterator,它是一个引用t类型的const元素的可变迭代器;它不能处理本身就是const的迭代器对象(即"const-iterator"或"iteratorconst")。
- 如果你知道你正在处理一个std::vector,那么使用std::advance没有意义。它只会诱使您认为自己在编写容器无关的代码(而不是这样,考虑到迭代器无效规则、不同的运行时复杂性等等)。当std::advance有意义时,唯一的情况是您自己编写一个不知道它处理的是哪种迭代器的模板。
因此,auto it = std::next(v.begin(), index);
更新:需要一个C + +编译器试用标准
- 应该注意的是,这是C++ 11的方式!std::next等同于std::advance。使用这些函数而不是使用算术方法可以使交换容器类型变得容易得多。甚至可以在C数组afaik上工作,就像std::begin和std::end一样。
- 还应该注意,std::advance是由一个白痴设计的,因为它使用一个引用作为输出,而不是返回值。
- 对于(auto it=begin(c);它!=结束(c);前进(it,n))……}
- std::listlst;迭代器fifth_element=*std::next(lst.begin(),5);
- 都有自己的使用。useful for STDA::提前一altering在广场的迭代器。它是在循环性能。我喜欢的一个案例中的赋值,你建议。我只是发现了它并做一位苛刻的愚蠢。这是一个函数的设计的情况下,即使在不同的思维,他们基本上都是一样的。
- "如果你zoomulator:复制迭代器是一个性能问题,你有更大的问题要处理。
或者你可以使用std::advance
1 2
| vector<int>::iterator i = L.begin();
advance(i, 2); |
actutally性病::向量是用来加载C是用作表时需要。(这是标准的C + +实现的载体要求,只要我知道的替代数组中的维基百科)例如,它是完全合法的folowing这样做,告诉我:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15
| int main()
{
void foo(const char *);
sdt::vector<char> vec;
vec.push_back('h');
vec.push_back('e');
vec.push_back('l');
vec.push_back('l');
vec.push_back('o');
vec.push_back('/0');
foo(&vec[0]);
} |
当然,他们必须复制地址foo需要传递的参数信息和商店作为一个地方,你应该确保你的程序或不推到任何新项目或在血管内皮细胞,改变其容量要求。分段错误或风险……
因此,它导致在你的酒店
1
| vector.insert(pos, &vec[first_index], &vec[last_index]); |
- 让我想知道为什么他们决定抽象到迭代器,如果他们只是指针…他们基本上"隐藏"了这些能力。
- 为了一致?因为它可以方便地删除代码中任何其他类型容器的向量实例。
- &;vec[i]生成的指针不一定与vector<>:迭代器兼容。begin()+i还有一个好处,那就是无论您的库将它定义为什么样的迭代器——例如,在调试模式下包括检查迭代器。所以,如果您不需要指针(例如I/O),那么您应该总是更喜欢迭代器。
- @ KerrekSB从23.3.61.在C++标准草案中:"向量的元素是连续存储的,这意味着如果V是向量t,分配器>t是除BoL以外的某种类型,那么它服从所有0个<< n<V(0)+n;
- @Yvesbaumes:这与向量迭代器无关。然而,裸指针也是迭代器,这是真的——它们只是不是向量迭代器。
- @我的答案是关于参考类型的。