将迭代器转换为指针?

69

我有一个包含n个元素的std::vector。现在我需要传递指向最后n-1个元素的向量的指针给函数。

例如,我的vector<int> foo包含(5,2,6,87,251)。一个函数需要vector<int>*,我想给它传一个指向(2,6,87,251)的指针。

我可以安全地使用迭代器++foo.begin(),将其转换为指针并将其传递给函数吗?或者使用&foo[1]

更新: 人们建议我将我的函数更改为接受一个迭代器而不是指针。在我的情况下,这似乎不可能,因为我提到的函数是unordered_set<std::vector*>find函数。那么,在这种情况下,是将n-1个元素从foo复制到新向量中,并使用该向量的指针调用find是唯一的选择吗?非常低效!就像Shlemiel画家一样,特别是因为我必须查询许多子集:最后n-1,然后是n-2等元素,并查看它们是否在unordered_set中。


你能再解释一下你真正想做什么吗?我有点困惑——看起来你正在尝试使用unordered_set<>和unordered_set<>::find()来做一些它们并不真正设计用于的事情(但我很可能只是理解有误)。 - Michael Burr
你为什么要使用向量来表示无序集合呢?如果你需要进行多个成员查询,那么有更高效的实现方式。你可以创建一个集合,然后对其进行查询。 - Uri
我有一组已知的序列S。 对于每个新序列,我必须快速找出它是否在S中。 我意识到将已知序列存储为单独的向量,并在unordered_set中存储指向它们的指针是浪费内存的,而使用trie会更好。 但是我想要常数时间的查找功能。 - Frank
一个类似的情况是一组字符串指针。每个字符串实际上都是字符向量。现在你有一个新的字符串 s,并想用指向 s.substr(0),s.substr(1)等的指针重复调用 unordered_set<>::find()。 - Frank
那么你真的有一个向量,还是你有一个集合,想要像处理向量一样处理它? - John Dibling
这是一个向量;每个向量存储像(1,1,2,5,2)这样的序列,即它可能有重复元素,因此它不是一个集合。我的无序集合然后存储指向这样的向量的指针。 - Frank
13个回答

0
我还没有测试过,但你可以使用一组迭代器对吗?每个迭代器对将代表序列向量的起始和结束迭代器。例如:
typedef std::vector<int> Seq;
typedef std::pair<Seq::const_iterator, Seq::const_iterator> SeqRange;

bool operator< (const SeqRange& lhs, const SeqRange& rhs)
{
    Seq::const_iterator lhsNext = lhs.first;
    Seq::const_iterator rhsNext = rhs.first;

    while (lhsNext != lhs.second && rhsNext != rhs.second)
        if (*lhsNext < *rhsNext)
            return true;
        else if (*lhsNext > *rhsNext)
            return false;

    return false;
}

typedef std::set<SeqRange, std::less<SeqRange> > SeqSet;

Seq sequences;

void test (const SeqSet& seqSet, const SeqRange& seq)
{
    bool find = seqSet.find (seq) != seqSet.end ();
    bool find2 = seqSet.find (SeqRange (seq.first + 1, seq.second)) != seqSet.end ();
}

显然,向量必须像以前一样存放在其他地方。此外,如果修改了序列向量,则必须删除集合中的条目并重新添加,因为迭代器可能已更改。

乔恩


0

Vector是一个模板类,将类的内容转换为指针不安全: 您不能继承vector类以添加此新功能。 而改变函数参数实际上是一个更好的想法。 只需创建另一个int向量 vector temp_foo(foo.begin[X], foo.end()); 并将此向量传递给您的函数


-1
std::vector<int> v;
  :
auto it=v.end();
auto ptr=v.data()+std::distance(v.begin(),it);

1
这并没有回答原问题。而且,结果指针指向容器之外。 - zkoza
auto it = v.end(); 只是一个例子,接下来的代码可以安全地将迭代器转换为指针。end()应该超出容器的范围。你仍然可以安全地将其转换为指针。 - Hideaki Kazaoka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接