cpp 使用 abs() 函数和 size_t

cpp using abs() function with size_t

本文关键字:size 函数 使用 abs cpp      更新时间:2023-10-16

>我正在尝试检查两个字符是否是较大字符串中的邻居,但无法检查其索引中差异的绝对值。下面是我的代码:

string state_string = "012345";
string goal_state_string = "125430";
for (int i = 0; i < state_string.length() - 1; i++)
{
cout << abs(goal_state_string.find(state_string[i]) - goal_state_string.find(state_string[i + 1])) << endl;
}

当我运行时,我得到以下输出:

$ make test
g++ -std=c++11 test.cpp
test.cpp: In function ‘int main()’:
test.cpp:107:106: error: call of overloaded ‘abs(std::basic_string<char>::size_type)’ is ambiguous
cout << abs(goal_state_string.find(state_string[i]) - goal_state_string.find(state_string[i + 1])) << endl;
                                    ^
In file included from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/cstdlib:75:0,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/ext/string_conversions.h:41,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/basic_string.h:6349,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/string:52,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/locale_classes.h:40,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/ios_base.h:41,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/ios:42,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/ostream:38,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/iostream:39,
from test.cpp:1:
/usr/include/stdlib.h:70:5: note: candidate: int abs(int)
int abs (int);
^~~
In file included from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/cstdlib:77:0,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/ext/string_conversions.h:41,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/basic_string.h:6349,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/string:52,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/locale_classes.h:40,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/ios_base.h:41,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/ios:42,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/ostream:38,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/iostream:39,
from test.cpp:1:
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/std_abs.h:56:3: note: candidate: long int std::abs(long int)
abs(long __i) { return __builtin_labs(__i); }
^~~
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/std_abs.h:61:3: note: candidate: long long int std::abs(long long int)
abs(long long __x) { return __builtin_llabs (__x); }
^~~
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/std_abs.h:70:3: note: candidate: constexpr double std::abs(double)
abs(double __x)
^~~
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/std_abs.h:74:3: note: candidate: constexpr float std::abs(float)
abs(float __x)
^~~
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/std_abs.h:78:3: note: candidate: constexpr long double std::abs(long double)
abs(long double __x)
^~~
make: *** [Makefile:37: test] Error 1
hp user@DESKTOP-PGC8V9D /cygdrive/e/Google Drive/Phd_git/psvn/core/lessons/A-star
$ make test
g++ -std=c++11 test.cpp
test.cpp: In function ‘int main()’:
test.cpp:13:106: error: call of overloaded ‘abs(std::basic_string<char>::size_type)’ is ambiguous
cout << abs(goal_state_string.find(state_string[i]) - goal_state_string.find(state_string[i + 1])) << endl;
                                    ^
In file included from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/cstdlib:75:0,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/ext/string_conversions.h:41,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/basic_string.h:6349,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/string:52,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/locale_classes.h:40,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/ios_base.h:41,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/ios:42,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/ostream:38,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/iostream:39,
from test.cpp:1:
/usr/include/stdlib.h:70:5: note: candidate: int abs(int)
int abs (int);
^~~
In file included from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/cstdlib:77:0,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/ext/string_conversions.h:41,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/basic_string.h:6349,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/string:52,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/locale_classes.h:40,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/ios_base.h:41,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/ios:42,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/ostream:38,
from /usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/iostream:39,
from test.cpp:1:
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/std_abs.h:56:3: note: candidate: long int std::abs(long int)
abs(long __i) { return __builtin_labs(__i); }
^~~
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/std_abs.h:61:3: note: candidate: long long int std::abs(long long int)
abs(long long __x) { return __builtin_llabs (__x); }
^~~
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/std_abs.h:70:3: note: candidate: constexpr double std::abs(double)
abs(double __x)
^~~
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/std_abs.h:74:3: note: candidate: constexpr float std::abs(float)
abs(float __x)
^~~
/usr/lib/gcc/x86_64-pc-cygwin/7.3.0/include/c++/bits/std_abs.h:78:3: note: candidate: constexpr long double std::abs(long double)
abs(long double __x)
^~~
make: *** [Makefile:37: test] Error 1

我的问题如下:

  1. 不应该找到 find 函数返回某种整数类型,即一个无符号的 int,如果是这样,为什么不 IE。 有什么意义 拥有这种似乎不适用于大多数人的替代类型 应该调用哪些函数?
  2. 使用此类型/避免此问题时的最佳做法是什么?我应该把它投射到整数吗?

要了解abs做什么,我们必须了解signedunsigned类型之间的区别。

以下语句:

a = 10
b = -20
c = a + b

c的结果是否取决于abc是有符号的还是无符号的?

令人惊讶的是,它没有。 因为计算机使用二进制补码处理数字,所以如果 2 个数字被 2^N 分隔,它们被认为是相同的数字。

不仅addsubtract不在乎标志,multiplication也不在乎标志:

x*(2^N - y) = x*2^N - x*(-y) = x*(-y) mod 2^N

由于这种影响,有符号和无符号数字之间的限制被放宽。

更多细节可以在 X86 架构的指令集中找到。实际上 X86 定义了一个统一添加,它处理有符号和无符号添加,有符号和无符号添加之间的唯一区别是载体位(也称为溢出/下溢位(。

有些运营商确实关心标志。

  1. 人们肯定更喜欢 -1 而不是 4294967295,所以 printf 将有符号和无符号的符号分开了 "%u">
  2. 比较。4294967295> 0,但 -1 <0
  3. 腹肌功能
  4. 以及更多关于...

当使用关心标志的操作员时,你最好更加小心。这就是为什么不允许abs采用无符号参数的原因。