【问题标题】:How to save the index of a string in a vector?如何将字符串的索引保存在向量中?
【发布时间】:2021-03-02 07:58:50
【问题描述】:

假设我有一个函数 int pozvec(vector<string> vect) 它将一个预填充的字符串向量作为参数。

我想知道i的哪个位置有字符“p”,特别是“p”。所有字符串都是单字符,但向量被声明为包含字符串。我想保存在变量 x 中找到“p”的索引;

for(int i=0; i<vect.size(); i++)
    if(vect[i] == "p")
        x=i;

似乎不起作用。 strcmp 也没有。 问题比较复杂,但不能解决的就是这个。

提前感谢您的帮助!

【问题讨论】:

  • 使用std::find
  • 对我来说,你的代码工作得很好,正如你所看到的here。您将获得最后一次出现 "p" 在向量中的位置。

标签: c++ string vector strcmp


【解决方案1】:

我不知道你真正想做什么,但这对我来说非常好:

for (size_t i {}; i < vec.size(); ++i) {
   if (vec.at(i) == "p") {
       x = i;
       break; // I don't know wether you want to break here or not
   } else {
       continue;
   }
}

或者,如果您所有的字符串都只包含一个字符,这也应该可以:

for (size_t i {}; i < vec.size(); ++i) {
   if (vec.at(i).at(0) == 'p') {
       x = i;
       break; // I don't know wether you want to break here or not
   } else {
       continue;
   }
}

【讨论】:

  • 您的代码中不需要else{ continue;} 块。
  • 是的,该部分是可选的,但在某些情况下可能有用。
  • “at”的作用是什么?我对数组更有经验。谢谢!
  • .at() 方法仅适用于 STL 容器。它与 [] 几乎相同,因此我可以将 vec.at(i) 替换为 vec[i]。但是, .at() 方法会进行边界检查,而 [] 则不会。例如,如果我有一个包含 5 个元素的向量并调用 vec.at(7),它会抛出异常,但如果我说 vec[i],它不会进行边界检查,结果会很奇怪。所以你可以控制你的流程调用.at(),但不能用[],所以你应该像每次一样使用.at()。
【解决方案2】:

通过该函数,您可以存储您要查找的字符串的最后一次出现的索引。这是因为一旦找到第一次出现,您就没有退出循环。

要有条件地退出循环,请使用break 语句。

for(int i = 0; i< vect.size(); i++)
{
    if(vect[i] == "p")
    {
        x=i;
        break;
    }
}

现在它会在找到第一个匹配项后立即退出。

您还可以选择std::find

int index = std::find(vect.begin(), vect.end(), "P") - vect.begin()

【讨论】:

  • 您好!谢谢你。我忘了提到我确定该字符串只出现一次。
  • @AndrewFNAF 如果是这样的话,这会很好。
  • 但是如果我知道它可能的确切位置,我只想检查它是否在那里?假设向量的大小为 n,我想特别检查“p”是否在位置 [n*(n-1)],这样我就不必遍历整个向量。在这种情况下我可以使用 if() 吗?
  • @AndrewFNAF 是的,如果你想检查一个特定的位置/索引,只需使用if (vect[n * (n - 1)] == "p") { ... }
  • 除非那不起作用。这就是……我问的原因。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2020-07-24
  • 2020-10-28
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-15
相关资源
最近更新 更多