我在geeksforgeeks.org上查看了Prim's Algorithim的实现,并尝试在练习模式下实现该功能。我看了如何收到输入,然后看到了:
#include<bits/stdc++.h>
using namespace std;
const int MAX = 1e4 + 5;
int spanningTree(vector <pair<int,int> > g[], int n);
int main()
{
int t ;
cin>>t;
while(t--)
{
vector <pair<int,int> > adj[MAX];
int n,e;
int w, mC;
cin >> n>> e;
for(int i = 0;i < e;++i)
{
int x,y;
cin >> x >> y >> w;
adj[x].push_back({w, y});
adj[y].push_back({w, x});
}
mC= spanningTree(adj, MAX);
cout << mC << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我在了解他们的使用方式时遇到了很多麻烦vector。我从来没有见过一个载体以类似的方式传球到一个数组:vector <pair<int,int> > g[]。
我查看了STD的STD实现,vector但找不到有关以这种方式传递向量或使用构造向量的任何信息vector <pair<int,int> > adj[MAX];。
最后,对于以下代码的作用,我感到非常困惑:
adj[x].push_back({w, y});
adj[y].push_back({w, x});
Run Code Online (Sandbox Code Playgroud)
我尝试自己实施:
#include <iostream>
#include <vector>
#include <utility>
#include <string>
using namespace std;
int main()
{
vector< pair<string, int> > vec[2];
vec[0].push_back({"One", 1});
vec[1].push_back({"Two", 2});
for(int x = 0; x < 2; ++x){
cout << vec[x].first << ", " << vec[x].second << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
但是我得到一个错误class 'std::vector< pair<string, int> >' has no member named ‘first’。
如果我能帮助您了解vector此处的用法,我将不胜感激。我已经看过多个StackOverflow帖子,包括vector :: push_back与vector :: operator []。
原始问题的链接在这里
我从未见过以类似于数组的方式传递向量:
vector <pair<int,int> > g[]
这是一个数组!向量数组。
代码的问题在于,您有两个向量,每个向量都有一个元素,并且循环仅提取向量,而不是它们的单个元素。
您的版本为:
#include <iostream>
#include <vector>
#include <utility>
#include <string>
using namespace std;
int main()
{
vector< pair<string, int> > vec[2];
vec[0].push_back({"One", 1});
vec[1].push_back({"Two", 2});
for(int x = 0; x < 2; ++x){
cout << vec[x][0].first << ", " << vec[x][0].second << endl;
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
我添加的全部是[0](每个向量的索引)。
当然,这样的例子的实用性值得怀疑。在这种情况下,您似乎想要一个带有两个元素的向量,并且看不到任何数组。
老实说,我也不喜欢原始代码。混合数组和向量是造成混淆的秘诀(hyello);他们本可以使用“ 2D向量”,或者更好的是使用在其顶部放置2D索引的1D向量。这样也将具有更好的缓存位置。