【发布时间】:2011-09-02 10:37:34
【问题描述】:
int i;
vector<string> names;
string s = "penny";
names.push_back(s);
i = find(names.begin(), names.end(), s);
cout << i;
我正在尝试查找向量中元素的索引。 iterators 没问题,但我希望它为 int。我该怎么做?
【问题讨论】:
int i;
vector<string> names;
string s = "penny";
names.push_back(s);
i = find(names.begin(), names.end(), s);
cout << i;
我正在尝试查找向量中元素的索引。 iterators 没问题,但我希望它为 int。我该怎么做?
【问题讨论】:
您可以为此使用std::distance。
i = std::distance( names.begin(), std::find( names.begin(), names.end(), s ) );
不过,您可能需要检查您的索引是否超出范围。
if( i == names.size() )
// index out of bounds!
不过,在使用 std::distance 之前使用迭代器执行此操作可能更清楚。
std::vector<std::string>::iterator it = std::find( names.begin(), names.end(), s );
if( it == names.end() )
// not found - abort!
// otherwise...
i = std::distance( names.begin(), it );
【讨论】:
std::vector<string>::iterator it = std::find(names.begin(), names.end(), s);
if (it != names.end()) {
std::cout << std::distance(names.begin(), it);
} else {
// ... not found
}
【讨论】:
试试
i = (find( names.begin(), names.end(), s ) - names.begin());
编辑: 虽然您应该考虑使用 vector::size_type 而不是 int。
【讨论】:
std::vector<std::string>::iterator 是一个整数类型。
size_type,它是difference_type,默认ptrdiff_t,并且始终是有符号类型。
我对您的代码所做的假设:
using std::vector;
using std::cout;
using std::string;
如果我的假设是正确的,那么您可以在vector 的开头和iterator 之间的find 和distance(基本上是vector 的索引,您可以在其中找到这样的元素):
using std::distance;
就这样……
vector<string>::iterator i = find(names.begin(), names.end(), s);
if (i != names.end())
{
cout << "Index " << std::distance(names.begin(), i);
}
else
{
cout << s << "not found";
}
【讨论】:
你可以取消引用你的迭代器
int i = *name;
【讨论】: