在 C++ 中迭代 for 循环并将迭代器与负数进行比较。 int 可以存储 unsigned int 吗?
Iterating over a for loop in C++ and comparing the iterator to a negative number. Can an int store an unsigned int?
我想:
- 存储默认索引值“-1”。如果我完成对向量的迭代(使用 for 循环)并且索引值仍然是“-1”,我知道 none 我的 for 循环检查的值是匹配的。
- 如果找到合适的值,更新索引值以匹配我正在迭代的向量中的值的索引。
示例:
int index = -1;
for (int i; i < vector.size(); i++){
if (vector[i] == 1) {
index = i;
break;
}
}
但是,我总是从 for (int i; i < vector.size(); i++)
收到关于 "comparison between signed and unsigned integer expressions" 的警告。不幸的是,我不能只使用 unsigned integer index = -1
,因为无符号整数不能存储负值。 将 unsigned int i
值存储在 int index
中是否安全,或者我是否需要寻找不同的比较方法? 在这种情况下,我会更改 for循环到 for (unsigned int i; i < vector.size(); i++)
,但其余代码保持不变。
我可以使用一个单独的布尔变量,但每次我 运行 进入这种情况时使用额外的变量似乎更加混乱。它看起来像这样:
bool found = false;
unsigned int index = -1;
for (unsigned int i; i < vector.size(); i++){
if (vector[i] == 1) {
index = i;
bool = true;
break;
}
}
您应该使用 size_t
寻址到 std::vector
s。想一想有一天有人会向您的函数传递一个恰好包含 2^64 个条目的向量。
就个人而言,我发现布尔值更清晰,因为它使意图明确。
改用迭代器作为奖励,您根本不必编写循环:
auto it = std::find( vector.begin(), vector.end(), 1 );
if( it == vector.end() ) {
... // not found
}
如果您愿意,您可以使用带显式循环的迭代器。
auto it = vector.begin();
for( ; it != vector.end(); ++it ) {
if( *it == 1 ) break;
}
if( it == vector.end() ) {
... // not found
}
auto index = std::distance( vector.begin(), it );
你的第一种方法适用于小数字。
只需使用静态转换,直接告诉编译器你是故意这样做的
index = static_cast<int>(i);
并在循环中使用 unsigned int
您可以使用特殊值:
unsigned int index = (unsigned int)-1;
for (unsigned int i; i < vector.size(); i++){
if (vector[i] == 1) {
index = i;
break;
}
}
编译器会将 (unsigned int)-1
设置为适合 unsigned int 的最大值,对于 32 位表示为 4,294,967,295
我建议添加一个功能:
bool contains(std::vector<int> const& vec, int item);
那么,客户端代码可以简化为:
if ( contains(vector, 1) )
{
...
}
else
{
...
}
contains
的实施可以采用多种形式。
- 使用 index-based
for
循环。
- 使用范围-
for
循环。
- 使用
std::find
.
None 其中要求您存储标记索引值。
使用index-basedfor
循环
bool contains(std::vector<int> const& vector, int item)
{
for (size_t i = 0; i < vector.size(), ++i )
{
if ( vector[i] == item )
{
return true;
}
}
return false;
}
使用范围-for
循环
bool contains(std::vector<int> const& vector, int item)
{
for (auto x : vector)
{
if ( x == item )
{
return true;
}
}
return false;
}
使用std::find
bool contains(std::vector<int> const& vector, int item)
{
return (std::find(vector.begin(), vector.end(), item) != vector.end());
}
您可以在 size_t
中操作,无需切换到 int
。这样可以保证您的索引与向量的大小兼容。另外如果你还想比较-1,你可以。
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = { 0,2,3,4 };
size_t index = -1;
for (size_t i = 0, n = v.size(); i < n; ++i)
{
if (v[i] == 1)
{
index = i;
break;
}
}
if (static_cast<int>(index) == -1)
{
std::cout << "not found" << std::endl;
}
else
std::cout << index << std::endl;
}
我想:
- 存储默认索引值“-1”。如果我完成对向量的迭代(使用 for 循环)并且索引值仍然是“-1”,我知道 none 我的 for 循环检查的值是匹配的。
- 如果找到合适的值,更新索引值以匹配我正在迭代的向量中的值的索引。
示例:
int index = -1;
for (int i; i < vector.size(); i++){
if (vector[i] == 1) {
index = i;
break;
}
}
但是,我总是从 for (int i; i < vector.size(); i++)
收到关于 "comparison between signed and unsigned integer expressions" 的警告。不幸的是,我不能只使用 unsigned integer index = -1
,因为无符号整数不能存储负值。 将 unsigned int i
值存储在 int index
中是否安全,或者我是否需要寻找不同的比较方法? 在这种情况下,我会更改 for循环到 for (unsigned int i; i < vector.size(); i++)
,但其余代码保持不变。
我可以使用一个单独的布尔变量,但每次我 运行 进入这种情况时使用额外的变量似乎更加混乱。它看起来像这样:
bool found = false;
unsigned int index = -1;
for (unsigned int i; i < vector.size(); i++){
if (vector[i] == 1) {
index = i;
bool = true;
break;
}
}
您应该使用 size_t
寻址到 std::vector
s。想一想有一天有人会向您的函数传递一个恰好包含 2^64 个条目的向量。
就个人而言,我发现布尔值更清晰,因为它使意图明确。
改用迭代器作为奖励,您根本不必编写循环:
auto it = std::find( vector.begin(), vector.end(), 1 );
if( it == vector.end() ) {
... // not found
}
如果您愿意,您可以使用带显式循环的迭代器。
auto it = vector.begin();
for( ; it != vector.end(); ++it ) {
if( *it == 1 ) break;
}
if( it == vector.end() ) {
... // not found
}
auto index = std::distance( vector.begin(), it );
你的第一种方法适用于小数字。
只需使用静态转换,直接告诉编译器你是故意这样做的
index = static_cast<int>(i);
并在循环中使用 unsigned int
您可以使用特殊值:
unsigned int index = (unsigned int)-1;
for (unsigned int i; i < vector.size(); i++){
if (vector[i] == 1) {
index = i;
break;
}
}
编译器会将 (unsigned int)-1
设置为适合 unsigned int 的最大值,对于 32 位表示为 4,294,967,295
我建议添加一个功能:
bool contains(std::vector<int> const& vec, int item);
那么,客户端代码可以简化为:
if ( contains(vector, 1) )
{
...
}
else
{
...
}
contains
的实施可以采用多种形式。
- 使用 index-based
for
循环。 - 使用范围-
for
循环。 - 使用
std::find
.
None 其中要求您存储标记索引值。
使用index-basedfor
循环
bool contains(std::vector<int> const& vector, int item)
{
for (size_t i = 0; i < vector.size(), ++i )
{
if ( vector[i] == item )
{
return true;
}
}
return false;
}
使用范围-for
循环
bool contains(std::vector<int> const& vector, int item)
{
for (auto x : vector)
{
if ( x == item )
{
return true;
}
}
return false;
}
使用std::find
bool contains(std::vector<int> const& vector, int item)
{
return (std::find(vector.begin(), vector.end(), item) != vector.end());
}
您可以在 size_t
中操作,无需切换到 int
。这样可以保证您的索引与向量的大小兼容。另外如果你还想比较-1,你可以。
#include <iostream>
#include <vector>
int main()
{
std::vector<int> v = { 0,2,3,4 };
size_t index = -1;
for (size_t i = 0, n = v.size(); i < n; ++i)
{
if (v[i] == 1)
{
index = i;
break;
}
}
if (static_cast<int>(index) == -1)
{
std::cout << "not found" << std::endl;
}
else
std::cout << index << std::endl;
}