我有一组单词(BELLOW、CELLO、HAAF、HABIT、HADAL、HAIR、HELLO、HELP、RABIT(存储在std::set数据结构中。
-
从上面的集合DS中,我想提取以"H"开头(第0个索引(的单词,并将其存储在其他容器中(比如std::setstd::string ctr(。现在,ctr将有-HAAF,HABIT,HADAL,HAIR,HELLO,HELP
-
现在,我想从容器ctr中获取第二个字母(第一个索引(为"A"的单词。现在,ctr将有-HAAF,HABIT,HADAL,HAIR
-
我想获取除第0&第一指数。基本上,我不想检查字符串的第0和第1个位置。
现在,ctr将拥有-HAAF、HADAL
我不知道如何做第三步。
#include <iostream>
#include <set>
int main()
{
std::set<std::string> words = {"BELLOW", "CELLO", "HAAF",
"HABIT", "HADAL", "HAIR",
"HELLO", "HELP", "RABIT"};
for (const std::string& s : words) {
std::cout << s << std::endl;
}
std::set<std::string> etr;
/* Extract words start with letter 'H' */
for (const std::string& s : words) {
if (s[0] == 'H') {
//std::cout << s << std::endl;
etr.insert(s);
}
}
std::cout << std::endl;
for (const std::string& s : etr) {
std::cout << s << std::endl;
}
std::set<std::string> etr2;
/* Extract words start with letter 'H' &
second letter as 'A' */
for (const std::string& s : etr) {
if (s[1] == 'A') {
//std::cout << s << std::endl;
etr2.insert(s);
}
}
std::cout << std::endl;
for (const std::string& s : etr2) {
std::cout << s << std::endl;
}
/* Extract words start with letter 'H' &
second letter as 'A', and any other letter as 'A'
but not second letter */
// << I'm not sure >>
return 0;
}
运行此程序的链接
我所期望的解决方案:
for (const std::string& s : etr2) {
size_t occ = s.find('A');
// Repeat till end is reached
while(occ != std::string::npos) {
if (std::find(pos.begin(), pos.end(), occ) == pos.end()) {
etr.insert(s);
}
// Get the next occurrence from the current position
occ = s.find('A', occ + 1);
}
}
查找此解决方案的链接
与检查其他单词的方法相同:对集合进行迭代,但这次对每个单词进行迭代,并检查在合适的位置是否有A
。
但请注意,以前的检查可以在std::set
排序时更有效地完成,并且您需要提取"H"
和"I"
之间的字符串(I
在H
之后(。两个set::lower_bound
调用将返回范围。