小编Cha*_*l72的帖子

std :: vector迭代器失效

之前有一些关于这个问题的问题; 我的理解是,调用std::vector::erase只会使处于擦除元素之后的位置的迭代器无效.但是,在擦除元素之后,该位置的迭代器是否仍然有效(当然,前提是它end()在擦除后没有指向)?

我对如何实现向量的理解似乎表明迭代器肯定是可用的,但我不完全确定它是否会导致未定义的行为.

作为我正在谈论的一个例子,下面的代码从向量中删除所有奇数整数.此代码是否会导致未定义的行为?

typedef std::vector<int> vectype;
vectype vec;

for (int i = 0; i < 100; ++i) vec.push_back(i);

vectype::iterator it = vec.begin();
while (it != vec.end()) {
    if (*it % 2 == 1) vec.erase(it);
    else ++it;
}
Run Code Online (Sandbox Code Playgroud)

代码在我的机器上正常运行,但这并不能说服它是有效的.

c++ iterator stl vector

14
推荐指数
1
解决办法
9855
查看次数

STLish Radix/Patricia Trie的lower_bound函数

最近我一直在研究Patricia尝试,并使用一个非常好的C++实现,可以用作STL Sorted Associative Container.Patricia尝试与普通二叉树不同,因为叶节点具有指向内部节点的后向指针.尽管如此,如果您只通过叶节点后向指针访问内部节点,则可以通过执行有序遍历来按字母顺序遍历Patricia trie.

这让我想到了一个问题:是否可以用Patricia trie 实现STL lower_boundupper_bound功能?我使用的实施确实事实上,实现这些功能,但预计他们不工作.

例如:

typedef uxn::patl::trie_set<std::string> trie;
trie ts;
ts.insert("LR");
ts.insert("BLQ");
ts.insert("HCDA");

trie::iterator it = ts.lower_bound("GG");
std::cout << *it << std::endl;
Run Code Online (Sandbox Code Playgroud)

这会输出BLQ,当我希望它输出HCDA时.(std::set例如,肯定会在这里输出HCDA.)

我通过电子邮件发送了制作此库的开发人员,但从未收到回复.无论如何,我觉得我非常了解Patricia如何尝试工作,我无法弄清楚low_bound之类的东西是如何可行的.问题是lower_bound似乎依赖于按字母顺序比较两个字符串的能力.由于树中不存在"GG",我们需要找出哪个元素> =到GG.但Radix/Patricia尝试不使用词典比较从一个节点移动到另一个节点; 而是每个节点存储一个比特索引,用于对搜索关键字进行比特比较.位比较的结果告诉您是向左还是向右移动.这样可以很容易地在树中找到特定的前缀.但是如果树中不存在前缀,

我正在使用的C++实现似乎没有正确实现lower_bound的事实证实了我怀疑它可能是不可能的.尽管如此,你可以按字母顺序迭代树,这让我觉得可能有办法做到这一点.

有没有人有这方面的经验,或者知道是否可以用Patricia Trie实现lower_bound功能?

c++ stl trie patricia-trie

8
推荐指数
1
解决办法
1324
查看次数

标签 统计

c++ ×2

stl ×2

iterator ×1

patricia-trie ×1

trie ×1

vector ×1