这是我的代码,它试图在向量的最后四个元素中搜索字符串“gold”。它确实成功找到了字符串,但这样做安全吗?它适用于MS VS2008。
#include <vector>
#include <iostream>
int main() {
char random[] = {'a','b','c','d','e','f','g'};
char tofind2[] = {'g','o','l','d'};
std::vector<char> buf;
buf.insert(buf.end(), random, random+sizeof(random));
buf.insert(buf.end(), tofind2, tofind2+sizeof(tofind2));
if(buf.size() >= sizeof(tofind2) && std::equal(buf.end()-sizeof(tofind2), buf.end(), tofind2)) {
std::cout << "found value in last " << sizeof(tofind2) << " elements of array\n";
}
}
答案 0 :(得分:3)
只要你的vector
中至少有4个元素,这是安全的:通常可以通过其范围的边界移动迭代器,并且可以通过整数的加/减来移动随机访问迭代器类型。 std::vector
的迭代器是随机访问迭代器。
如果它少于4个元素,这是不安全的,并导致未定义的行为(甚至在你取消引用迭代器之前!)
如果你想小心,你应该检查那个案例。
template<typename Container>
auto nth_last_iterator( Container&& c, int n )
-> declval( std::begin(c) )
{
if (n > std::end(c) - std::begin(c))
n = std::end(c) - std::begin(c);
return std::end(c)-n;
}
这是C ++ 11并适用于任何随机访问容器。然后你得到:
if(std::equal(nth_last_iterator(buf,sizeof(tofind2)), buf.end(), tofind2)) {
std::cout << "found value in last " << sizeof(tofind2) << " elements of array\n";
}
如@DavidHammen所述,sizeof(tofind2)
仅在sizeof(tofind2[0]) == 1
时有效。有一些相对容易编写template
来查找数组的大小而没有那个弱点,例如:
template<typename T, std::size_t N>
std::size_t lengthof( T(&)[N] ) {
return N;
}
这是有效的C ++ 03,在C ++ 11中你可以使它constexpr
。 (您也可以将其扩展到std::array< T, N > const&
)
答案 1 :(得分:0)
这是正确的,你可以安全地做到这一点,因为允许使用迭代器算术(http://www.cplusplus.com/reference/iterator/RandomAccessIterator/)。