Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/templates/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C++ C++;访问向量的某个索引范围_C++_String_Vector - Fatal编程技术网

C++ C++;访问向量的某个索引范围

C++ C++;访问向量的某个索引范围,c++,string,vector,C++,String,Vector,我想我遇到了一个简单的问题,但我在任何地方都找不到解决办法 我有一个包含很多单词的字符串向量。假设第一个元素有5个字母,但我只想访问第一个3个字母。我该怎么做 std::string test_word = "hou"; std::vector<std::string> words = {"house", "apple", "dog", "tree", ...} if (test_word == /*(words[0].begin(), words[0].begin()+3)*/)

我想我遇到了一个简单的问题,但我在任何地方都找不到解决办法

我有一个包含很多单词的字符串向量。假设第一个元素有5个字母,但我只想访问第一个3个字母。我该怎么做

std::string test_word = "hou";
std::vector<std::string> words = {"house", "apple", "dog", "tree", ...}

if (test_word == /*(words[0].begin(), words[0].begin()+3)*/) {
...
}
std::字符串测试\u word=“hou”;
向量词={“房子”、“苹果”、“狗”、“树”…}
如果(测试单词==/*(单词[0].begin(),单词[0].begin()+3)*/){
...
}
写它的正确语法方法是什么

编辑:解决方案

std::string test_word = "hou";
std::vector<std::string> words = {"house", "apple", "dog", "tree", ...}

for (int i = 0; i < words.size(); i++) {
   for (int j = 1; j <= words[i].size(); j++) {
      if (words[i].compare(0,j, test_word) == 0) {
      ...
      }
   }
}
std::字符串测试\u word=“hou”;
向量词={“房子”、“苹果”、“狗”、“树”…}
for(int i=0;i对于(int j=1;j如果您对
std::string
特别感兴趣,您可以使用

如注释中所述,您也可以使用
std::equal

if (std::equal(begin(test_word), begin(test_word) + 3, begin(words[0]))
“假设第一个元素有5个字母,但我只想访问前3个字母。我该怎么做?!”

您可以应用该功能来引用前3个字母:

if (test_word == words[0].substr(0,3)) {
应避免进行不必要的内存分配

我只想访问第一个

使用
std::string::substr
是一种方便的方法,但它可能会导致堆分配。因此,如果您需要性能,或者希望准确地坚持目标,并且只访问这些元素,那么您应该使用
std::equal
from
algorithm

std::equal(words[0].begin(), words[0].begin()+3,
  "text which is not shorter than 3 elements")

还有
compare
成员函数,如putnampp所示。

注意
substr
可能会导致堆分配。如果这是一个紧密的循环,您最好使用
std::equal
。@DanielJour说得好,为什么不发布一个答案来演示它是如何工作的?谢谢您的快速回答!这可能很好。这可能也适用于我正确的代码,我在其中运行for循环,检查“test\u word==h”,然后是“test\u word==ho”,然后是“test\u word==hou”。。因此,只需
if(test\u word==words[0].substr(0,j))
,循环参数为
j
。)如果您正在按所述在循环中运行此函数,那么您真的应该使用
std::equal
或compare member函数来避免可能的分配。(我在手机上,这就是为什么写答案需要一段时间的原因)啊,我想我明白了。
substr
实际上会创建一个新字符串,因此会分配新的空间。如果
equal
不这样做,那么它会更好,因为我正在遍历字符串的每个单词,甚至每个单词的每个字母。嗯,我正要问这个问题。我刚刚点击了compare()阅读有关新学习的substr()的内容时。您可能认为这更有效?简短回答:希望比较更有效。长回答:应优化比较,以定位比较两个字符串,直到第一个不匹配,或最多匹配长度结束(在本例中为3).相反,substr可以返回单词[0]的前三个字符的副本。尽管如此,由于比较长度很小,并且您正在寻找完全相等的值,优化编译器可能能够执行一些内存比较技巧,使任何性能差异都不明显。非常感谢!我根据您的建议扩展了我的原始问题。它按照我希望的方式工作:)您的解决方案效率低下。Comp不需要将字符串的长度超过test_word的长度。请注意,当j>test_word.size()时,您的if语句将始终为false。例如,当i=0和j=4时,单词[0]。compare(0,4,test_word)将永远不会返回0,因为“hous”不等于“hou”。是否尝试查找具有相同前缀的单词中的所有字符串(即test_word)?@putnampp-是的,你是对的,这是一个小问题。但我不知道如何检查它。这有点回到了我最初的问题:如何选择向量的某个范围。(我来自Matlab,非常简单)。我可以这样做:
if(words[I].substr(0,j).size()@putnampp-也是的,我正在检查向量中单词的每个可能前缀是否等于test_单词。test_单词的长度总是不同(取决于输入),这就是为什么我需要第二个循环来真正检查
ho=
,然后
hou=
,然后
hous=
,然后
house=
,然后
ap=
…等等。简单的观察:1)单词[I]。substr(0,j)。size()将始终是j!2)您正在检查'h'=='hou','ho'='hou','hou'='hou','hous'='hou','house'='hou'。在这5个测试中,只有第三个测试是正确的。如果这是所需的逻辑,那么您可以简化代码并完全删除内部循环。只需执行'If(words[i]。比较(0,test\u word.size(),test\u word)==0)'如果你想为每个'h'='h','ho'='ho','hou'='hou'(即单词中的单词和测试单词的前缀之间的每个通用前缀)执行一些任务,那么内部循环是必要的。但是你可以将其条件更改为j
if( words[0].compare(0,3, test_word) == 0)
std::equal(words[0].begin(), words[0].begin()+3,
  "text which is not shorter than 3 elements")