c++ - 一些 C++ vector 问题

标签 c++ string pointers vector

我正在尝试学习一些 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/

相关文章:

V8 的 JavaScript 标准库

c++ - [expr.reinterpret.cast]/6 下面的注释是什么意思?

c# - Visual Studio 2010 编辑器意外自动更正

java - Struts 1 ActionForm 中的处理日期

无法在新数组中指向或存储数组元素

c++ - 自定义智能指针代码问题 - 智能指针不能在堆上结束吗?

c++ - 取消引用 `new` 指针是否被认为是好的风格?

c++ - 将整数放入数组 C++

Python 正则表达式 : issues in skipping delimiter between quotes

java - 字符串池在 Java 中为同一个字符串创建两个字符串对象