0 c++ graph vector push-back std-pair
#include <iostream>
#include <sstream>
#include <vector>
#define ii pair<int, int>
using namespace std;
// DSK -> DSC
int n;
vector <ii> edge;
string s, num;
int main()
{
cin >> n;
cin.ignore();
for(int i = 1; i <= n; i++)
{
getline(cin, s);
stringstream ss(s);
while(ss >> num)
if(i < stoi(num))
edge.push_back({i, stoi(num)});
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
error: expected expression
edge.push_back({i, stoi(num)});
^
Run Code Online (Sandbox Code Playgroud)
使用 VSCode 将 std::pair 推送到向量时,如何修复图形代码中的“预期表达式”错误?
我的通灵能力表明你使用的是旧版本的 C++。也许是 C++11?不确定您使用的是哪个编译器,但有一些命令行标志可以将编译器环境设置为比默认值更新的标准。
铿锵/g++:-std=c++17
微软VC:/std:c++17
无论如何,有比与编译器对抗更简单的方法来解决这个问题。只需为其提供所需的类型即可使其满意,而不是尝试推断如何强制内联参数。
对于实际上只有几个整数的情况,这不会导致任何性能损失。无论如何,编译器都会优化零售版本中的额外副本(如果有):
而不是这个:
edge.push_back({i, stoi(num)});
Run Code Online (Sandbox Code Playgroud)
这:
std::pair<int,int> p = {i, stoi(num)};
edge.push_back(p);
Run Code Online (Sandbox Code Playgroud)
专业提示与您的问题无关。始终对嵌套语句使用花括号,即使它只是一行。它将防止以后由于没有显式声明块而容易发生的错误。而不是这个:
while(ss >> num)
if(i < stoi(num))
edge.push_back({i, stoi(num)});
Run Code Online (Sandbox Code Playgroud)
这:
while(ss >> num)
{
if(i < stoi(num))
{
edge.push_back({i, stoi(num)});
}
}
Run Code Online (Sandbox Code Playgroud)
总而言之:
while(ss >> num)
{
if(i < stoi(num))
{
std::pair<int,int> p = {i, stoi(num)};
edge.push_back(p);
}
}
Run Code Online (Sandbox Code Playgroud)
建议使用make_pair或的其他答案和评论emplace_back也是很好的建议。