我有一个已经排序的向量,称为vec,还有一个目标变量。目标是返回最接近目标的向量元素。
我试图将C ++ 11 lambda函数与[=]一起使用以捕获外部变量
#include <algorithm>
#include <iostream>
#include <vector>
using namespace std;
int main() {
vector<int> vec{1,2,3,4,5};
double target = 3.14159;
int res = min(vec.begin(), vec.end(), [=](int v1, int v2) -> bool {
return abs(v1-target) < abs(v2-target);
});
cout << res << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我希望得到res = 3,但是会返回错误:
error: cannot convert 'const __gnu_cxx::__normal_iterator<int*, std::vector<int> >' to 'int' in initialization
Run Code Online (Sandbox Code Playgroud) 我想使用 Mac 的 clang 目前不支持的一些 C++17 功能,所以我使用
brew install gcc --HEAD
Run Code Online (Sandbox Code Playgroud)
安装 g++ 10.0.1 版本。通过直接调用,代码在终端中运行良好
g++-HEAD -std=c++17 test.cpp
Run Code Online (Sandbox Code Playgroud)
我还在 bash 中创建了一个链接ln -s g++-HEAD g++,并alias g++='g++ -std=c++17'在 中添加了一个别名.bash_profile,这样
g++ test.cpp
Run Code Online (Sandbox Code Playgroud)
会做同样的工作。
我想在 Visual Studio Code - Mac 版本中运行 C++ 代码。安装 Microsoft 的 C/C++ 扩展和 Code Runner 扩展后,我在 VSCode 中设置文件settings.json以包含编译器参数:
{
"C_Cpp.default.cppStandard": "c++17",
"C_Cpp.default.compilerPath": "/usr/bin/g++",
"C_Cpp.default.intelliSenseMode": "gcc-x64",
"C_Cpp.default.compilerArgs": [
"-std=c++17"
]
}
Run Code Online (Sandbox Code Playgroud)
然后我尝试运行相同的代码。但是,我收到警告:
[Running] cd "/some directory/" && g++ test.cpp -o test && "/some …Run Code Online (Sandbox Code Playgroud) 我知道 C++11 初始化vectorusing 的方式auto,实际上std::initializer_list是初始化而不是vector. 但是,给出以下代码:
#include <iostream>
#include <vector>
using namespace std;
int main() {
auto x = {1, 2};
cout << typeid(x).name() << endl;
auto z = (1, 2);
cout << z << ", type: " << typeid(z).name() << endl;
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我不明白:
x返回St16initializer_listIiE的类型是 'z' 返回的类型是 'i',使用 gcc-10 编译器。我们不应该只返回std::initializer_list和'int'吗?z:warning: left operand of comma operator has no effect [-Wunused-value]。那么结果的第二部分是:2, …