访问列表向量中的结构

Posted

技术标签:

【中文标题】访问列表向量中的结构【英文标题】:Accessing structs in a vector of lists 【发布时间】:2018-09-21 22:09:32 【问题描述】:

我有一个名为 Edge 的结构列表向量

所以,

vector<list<Edge>> adjA;

我的结构看起来像:

struct Edge 
   int weight;
   ... 

假设我的 adjA 已经被边填充了,我将如何访问这些边的变量?

vector<int>weights;
for(uint i = 0; i < adjA.size(); i++) //iterating through vector
  for(uint j = 0; j < adjA[i].size(); j++) //iterating through list
   
      weights.push_back(adjA[i][j].weight); //compiler error
    

错误:

no match for ‘operator[]’ (operand types are ‘__gnu_cxx::__alloc_traits<std::allocator<std::__cxx11::list<Edge> > >::value_type aka std::__cxx11::list<Edge>’ and ‘uint aka unsigned int’)
       weights.push_back(adjA[i][j].weight);

提前致谢

【问题讨论】:

std::list 没有operator [] () 如果你需要直接访问,也许你需要一个vector的vector 警惕 std::list。它实际上从来都不是向量的更好选择,即使向量导致 O(n) 惩罚的操作并不少见。 youtube.com/watch?v=YQs6IC-vgmo 链接的视频有 C++ 的创始人支持这个理由。 【参考方案1】:

std::list 没有operator [] ()

您可以使用基于范围的for 循环:

for (const auto &edges : adjA)

    for (const auto &edge : edges)
    
        weights.push_back(edge.weight);
    

或迭代器:

for (auto it = adjA.begin(); it != adjA.end(); it++)

    for (auto jt = it->begin(); jt != it->end(); jt++)
    
        weights.push_back(jt->weight);
    

【讨论】:

【参考方案2】:

您不能使用 [] 运算符访问 stl 列表的元素,但是您可以使用迭代器来迭代列表:

vector<int>weights;
for(uint i = 0; i < adjA.size(); i++) //iterating through vector
  
    for (std::list<Edge>::iterator it = adjA[i].begin(); it != adjA[i].end(); ++it)
    
        weights.push_back(it->weight);
    

【讨论】:

啊哈,谢谢。是的,我刚刚意识到我不能像数组一样访问列表。必须使用迭代器 你首先得到了答案。干得好!【参考方案3】:

根据this somewhat dated reference,list 没有[] 运算符。相反,请尝试使用iterator

for(std::list<Edge>::iterator it = adjA[i].begin(); it != adjA[i].end(); ++it)

    weights.push_back(it->weight);
 

【讨论】:

以上是关于访问列表向量中的结构的主要内容,如果未能解决你的问题,请参考以下文章

在 C++ 中访问列表向量的问题

R访问Array内部列表中的向量

根据包含的类型检索向量的向量

——R的数据组织

——R的数据组织

如何访问在 C++ 中通过引用传递的列表/向量的元素