我正在尝试学习一些 C++,首先我创建了一些方法来处理控制台的输出和读取。 我有 2 个主要问题,在代码中标记,操作/访问通过引用传入的字符串的 std::vector 中的值。
下面的方法接受一个问题(std 字符串)来询问用户和一个 vector std 字符串,其中包含用户认为可接受的回答。为了学习,我还想访问 vector 中的字符串并更改其值。
std::string My_Namespace::My_Class::ask(std::string question, std::vector<std::string> *validInputs){
bool val = false;
std::string response;
while(!val){
//Ask and get a response
response = ask(question);
//Iterate through the acceptable responses looking for a match
for(unsigned int i = 0; i < validInputs->size(); i++){
if(response == validInputs->at(i)){
////1) Above condition always returns true/////
val = true;
break;
}
}
}
//////////2) does not print anything//////////
println(validInputs->at(0)); //note the println method is just cout << param << "\n" << std::endl
//Really I want to manipulate its value (not the pointer the actual value)
//So I'd want something analogous to validInputs.set(index, newVal); from java
///////////////////////////////////////////
}
几个额外的问题:
3) 我在 vector 上使用 .at(index) 来获取值,但我读到应该使用 [] 来代替,但是我不确定它应该是什么样子 (validInputs[i ] 不编译)。
4) 我认为由于不需要深拷贝,所以传递一个指向 vector 的指针是一个很好的做法,有人可以验证这一点吗?
5) 我听说在循环中++i 比 i++ 更好,是这样吗?为什么?
最佳答案
3) 使用 at
应该没有显着差异和 operator[]
在这种情况下。请注意,您有一个指向 vector 的指针,而不是一个 vector (也不是对 vector 的引用),因此您将不得不使用 (*validInputs)[i]
或 validInputs->operator[](i)
使用运算符重载。使用 validInputs->at(i)
如果您不想使用这些其他方法中的任何一种,那很好。 (如果参数超出数组边界,at
方法将抛出异常,而当参数超出数组边界时,operator[]
方法有未定义的行为。由于 operator[]
跳过边界检查,它是如果您知道 i
在 vector 的范围内,速度会更快。如果您不确定,请使用 at
并准备好捕获异常。)
4) 指针很好,但引用会更好。如果您不在方法中修改 vector ,则最好使用对常量 vector 的引用 ( std::vector<std::string> const &
)。这可确保不会向您传递空指针(引用不能为空),同时还确保您不会意外修改 vector 。
5) 通常是这样。 i++
是后自增,也就是说必须复制原值,那么i
递增并返回原始值的拷贝。 ++i
增量 i
然后返回 i
, 所以它通常更快,尤其是在处理复杂的迭代器时。用unsigned int
编译器应该足够聪明,能够意识到预增量会很好,但是开始使用 ++i
的实践是很好的如果您不需要 i
的原始未增加值.
关于c++ - 一些 C++ vector 问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14406543/