Answers:
您需要使用类的begin
和end
方法vector
,它们分别返回引用第一个和最后一个元素的迭代器。
using namespace std;
vector<string> myvector; // a vector of stings.
// push some strings in the vector.
myvector.push_back("a");
myvector.push_back("b");
myvector.push_back("c");
myvector.push_back("d");
vector<string>::iterator it; // declare an iterator to a vector of strings
int n = 3; // nth element to be found.
int i = 0; // counter.
// now start at from the beginning
// and keep iterating over the element till you find
// nth element...or reach the end of vector.
for(it = myvector.begin(); it != myvector.end(); it++,i++ ) {
// found nth element..print and break.
if(i == n) {
cout<< *it << endl; // prints d.
break;
}
}
// other easier ways of doing the same.
// using operator[]
cout<<myvector[n]<<endl; // prints d.
// using the at method
cout << myvector.at(n) << endl; // prints d.
std::vector
具有随机访问迭代器的事实。
std::advance(it, n)
。它的定义完全可以满足您的要求,it + n
如果将迭代器标记为随机访问,它将自动使用它;如果需要,则可以执行循环。
通常,迭代器用于以线性方式访问容器的元素。但是,通过“随机访问迭代器”,可以用与相同的方式访问任何元素operator[]
。
要访问vector中的任意元素 vec
,可以使用以下命令:
vec.begin() // 1st
vec.begin()+1 // 2nd
// ...
vec.begin()+(i-1) // ith
// ...
vec.begin()+(vec.size()-1) // last
以下是典型访问模式(C ++的早期版本)的示例:
int sum = 0;
using Iter = std::vector<int>::const_iterator;
for (Iter it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
使用迭代器的优点是可以将相同的模式应用于其他容器:
sum = 0;
for (Iter it = lst.begin(); it!=lst.end(); ++it) {
sum += *it;
}
因此,创建无论容器类型如何都相同的模板代码确实很容易。迭代器的另一个优点是它不假定数据驻留在内存中。例如,可以创建一个正向迭代器,该正向迭代器可以从输入流中读取数据,或者可以简单地动态生成数据(例如,范围或随机数生成器)。
使用std::for_each
和lambdas的另一种选择:
sum = 0;
std::for_each(vec.begin(), vec.end(), [&sum](int i) { sum += i; });
从C ++ 11开始,您auto
可以避免指定一个很长,很复杂的迭代器类型名称,如之前所见(或更复杂):
sum = 0;
for (auto it = vec.begin(); it!=vec.end(); ++it) {
sum += *it;
}
此外,还有一个更简单的for-each变体:
sum = 0;
for (auto value : vec) {
sum += value;
}
最后,std::accumulate
无论添加整数还是浮点数,都必须要小心。
在C ++-11中,您可以执行以下操作:
std::vector<int> v = {0, 1, 2, 3, 4, 5};
for (auto i : v)
{
// access by value, the type of i is int
std::cout << i << ' ';
}
std::cout << '\n';
看到这里的变化:https : //en.cppreference.com/w/cpp/language/range-for
7.5.0
在Ubuntu 18.04上使用gcc尝试过,并且以相同的方式用于数组。
Vector的迭代器是随机访问迭代器,这意味着它们的外观看起来像普通指针。
您可以通过在容器begin()
方法返回的迭代器中添加n来访问第n个元素,也可以使用operator []
。
std::vector<int> vec(10);
std::vector<int>::iterator it = vec.begin();
int sixth = *(it + 5);
int third = *(2 + it);
int second = it[1];
另外,您可以使用与所有迭代器一起使用的高级功能。(您必须考虑是否真的要使用非随机访问迭代器执行“随机访问”,因为这样做可能会很昂贵。)
std::vector<int> vec(10);
std::vector<int>::iterator it = vec.begin();
std::advance(it, 5);
int sixth = *it;
advance
用于随机访问迭代器,也可以用于未知类别的迭代器,因为在这种情况下,它可以保证恒定的时间运行。这就是为什么应正确标记用户定义的迭代器的原因。
advance
如果您知道要处理随机访问迭代器,则使用它确实很烦人(由于使用了out参数)。仅在通用代码中推荐使用,并且如果不常用的话(如果该算法不能很好地支持非随机访问迭代器,那么就可以了-例如,std::sort
可以排序,std::list
但不能,因为它效率极低) )。
operator+
。但是问题显然是关于向量的,因此答案的第一部分没有任何问题。我只是以为第二部分可能暗示对以前从未见过的人“即使您愿意,也不能对随机访问迭代器使用高级” advance
。
Vector
应该是小写
这是一个在循环内使用a 的ith
索引的示例,该循环不需要递增两个迭代器。std::vector
std::iterator
std::vector<std::string> strs = {"sigma" "alpha", "beta", "rho", "nova"};
int nth = 2;
std::vector<std::string>::iterator it;
for(it = strs.begin(); it != strs.end(); it++) {
int ith = it - strs.begin();
if(ith == nth) {
printf("Iterator within a for-loop: strs[%d] = %s\n", ith, (*it).c_str());
}
}
没有for循环
it = strs.begin() + nth;
printf("Iterator without a for-loop: strs[%d] = %s\n", nth, (*it).c_str());
和使用at
方法:
printf("Using at position: strs[%d] = %s\n", nth, strs.at(nth).c_str());