迭代器的性质,当与C ++中的vector <string>一起使用时

时间:2016-12-14 21:27:23

标签: string c++11 vector iterator

我试图将所有命令行参数放入vector<string>容器中。这就是我所拥有的:

int main (int argc, char* argv[]) {

   if (argc >= 2) {
       std::vector<std::string> words;
       for (auto itr = argv + 1; itr != argv+argc; ++itr) {
           words.push_back(*itr);
           std::cout<<"the word is : "<<words[**itr]<<std::endl;
       }
   } 
   else {
       std::cout<<"Error: Please enter a command-line argument!\n";
       return 0;
   }

   return 0;
}

虽然它编译得很好(GCC 5.3.0),但输出是空白的:

MacBook-Pro:trial2 Hossein$ ./main.exe Hello, my name is Hossein

the word is : 
the word is : 
the word is : 
the word is : 
the word is : 

直观地说,我会在循环中使用words[itr]。为什么这是错的?从更一般的角度来看,这里itr的本质是什么?换句话说,在此示例中,如何将auto替换为vector::iterator

2 个答案:

答案 0 :(得分:0)

我认为相反

std::cout<<"the word is : "<<words[**itr]<<std::endl;

你应该写

std::cout<<"the word is : "<< words.back() <<std::endl;

如果您打算在words

中插入最后一个字符串

我很惊讶words[**itr]没有杀死该计划因为,#34;您好,我的名字是Hossein&#34;,**itr值是第一个这些词的字母,即&#34; H&#34; (整数72),&#34; m&#34; (整数109),&#34; n&#34; (整数110),&#34; i&#34; (整数105)和再次&#34; H&#34;。

因此,对于words[**itr],您应该访问words的位置太高。

OP问

  

我想知道是否有办法随[]运营商进行随机访问?

是的,有:

   for (auto i = 1; i < argc; ++i ) {
       words.push_back(argv[i]);
       std::cout << "the word is : " << words[i-1] << std::endl;
   }

但我认为(恕我直言)back()更优雅。

答案 1 :(得分:0)

在你的循环中,auto解析为char**指针,其中*itr访问argv[]数组中的特定字符串,**itr访问第一个该字符串的字符。这不是vector元素的有效索引。

<< words[**itr]应该只是<< *itr而已。

如果你真的想使用vector迭代器,你应该首先自己进行push_back()循环,然后使用第二个循环来迭代完成的向量,例如:

for (auto itr = argv + 1; itr != argv+argc; ++itr) {
    words.push_back(*itr);
}

for (auto &word : words) {
    std::cout << "the word is : " << word << std::endl;
}

在这种情况下,第一个循环可以替换为std::copy()std::back_inserter,例如:

std::copy(argv + 1, argv + argc, std::back_inserter(words));

for (auto &w : words) {
    std::cout << "the word is : " << w << std::endl;
}