在迭代 vector<> 时获取除第 i 个以外的所有其他元素

Posted

技术标签:

【中文标题】在迭代 vector<> 时获取除第 i 个以外的所有其他元素【英文标题】:while iterating over vector<> get all other elements but ith 【发布时间】:2015-09-02 23:22:59 【问题描述】:

假设我们有一个大小为 n 的向量。

第一个元素,我们必须从其他元素中获取信息。

第二个元素,我们必须从第一个元素和其他元素中获取信息。

第三个元素,我们必须从元素一、二和其他元素中获取信息。

等等

我该怎么做呢?到目前为止的代码..

vector<struct> myVector;
//vector filled..
for(Struct structure : myVector)
    //??

vector[0] 需要vector[1] -&gt; vector[n]

vector[1] 需要vector[0] , vector[2] -&gt; vector[n]

vector[2] 需要vector[0] -&gt; vector[1] , vector[3] -&gt; vector[n]

等等

我的结构如下所示,我需要从每个结构中获取学位信息,以便将其与当前结构进行比较(查看它们之间的距离)。

struct Node 
    int degree;
    std::string name;
    int counter;
    Node(std::string aName, int aDegree, int nodeCounter) 
        degree = aDegree;
        name = aName;
        counter = nodeCounter;
    
;

【问题讨论】:

您需要从所有其他元素中获得什么样的信息?你能展示你的“结构”并更具体一点吗? @P0W 我添加了更多信息以及我从结构中得到的信息。 @听起来像一个图形问题,发布的答案可以解决问题,但您可能会考虑更好的选择。对不起,我不是算法忍者 @P0W 感谢您的输入! 【参考方案1】:

这么简单?

vector<int> data =  1, 2, 3, 4, 5, 6, 7, 8, 9, 10 ;

int ii = 0;    

for (int i : data)

    int jj = 0;
    for (int j : data)
    
        if (ii == jj) continue;
        // do your stuff
        jj++            
    
    ii++

如果在修改之前需要对初始向量进行操作,如果需要修改,那就先复制一份。

【讨论】:

啊,我一直低着头,甚至没有考虑过切换到两个这样的 for 循环。谢谢! @hownowbrowncow:是的,两个循环中没有任何内容取决于向量内容(此类代码属于// do your stuff 部分)。【参考方案2】:

你可以这样做:

vector<int> data = 1,2,3,4,5,6,7,8,9,10;

auto current = data.cbegin();   
while (current != data.cend()) 
  for (auto it = data.cbegin(); it != data.cend(); ++it) 
    if (it != current)
      cout << *it;
  

  cout << endl;
  ++current;

【讨论】:

【参考方案3】:

您可以测试元素的地址

#include <vector>
#include <iostream>

struct Node 
    std::string name;
    int degree;
    int counter;

    Node(std::string name, int degree, int counter)
    : name(name), degree(degree), counter(counter) // better to use init list
    
    
;

int main()

    std::vector<Node> v "X", 1, 5, "O", 3, 2, "B", 8, 3;

    for(auto& node1: v) // take references
    
        for(auto& node2: v)
        
            // compare addresses
            if(&node1 == &node2) // & = address of operator
                continue;

            // use node1 & node2 here
            std::cout << node1.name << ' ' << node2.name << '\n';
        
    

输出:

X O
X B
O X
O B
B X
B O

【讨论】:

购买啤酒的冲动加剧

以上是关于在迭代 vector<> 时获取除第 i 个以外的所有其他元素的主要内容,如果未能解决你的问题,请参考以下文章

HTML表格在悬停时突出显示除第一行(标题)之外的行

vector迭代器失效的两种情况

vector迭代器失效的两种情况

如何在不复制的情况下从 N 维容器中获取可迭代范围?

vector迭代器失效的两种情况

在 std::vector<T> 和 std::vector<unique_ptr<T>> 上均匀迭代