我试图将所有命令行参数放入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
?
答案 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;
}