Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/string/5.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++,开始时我创建了一些方法来处理从控制台输出到和读取。 我有两个主要问题,代码中有标记,操作/访问通过引用传入的字符串的std::vector中的值_C++_String_Pointers_Vector - Fatal编程技术网

一些C++;向量问题 我正在学习一些C++,开始时我创建了一些方法来处理从控制台输出到和读取。 我有两个主要问题,代码中有标记,操作/访问通过引用传入的字符串的std::vector中的值

一些C++;向量问题 我正在学习一些C++,开始时我创建了一些方法来处理从控制台输出到和读取。 我有两个主要问题,代码中有标记,操作/访问通过引用传入的字符串的std::vector中的值,c++,string,pointers,vector,C++,String,Pointers,Vector,下面的方法接受一个问题(std字符串)来询问用户,以及一个向量std字符串,其中包含用户认为可以接受的响应。为了学习,我还想访问向量中的字符串并更改其值 std::string My_Namespace::My_Class::ask(std::string question, std::vector<std::string> *validInputs){ bool val = false; std::string response; while(!val){

下面的方法接受一个问题(std字符串)来询问用户,以及一个向量std字符串,其中包含用户认为可以接受的响应。为了学习,我还想访问向量中的字符串并更改其值

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
///////////////////////////////////////////
}
std::string My_Namespace::My_Class::ask(std::string question,std::vector*validInputs){
布尔值=假;
字符串响应;
而(!val){
//询问并得到答复
回答=问(问题);
//迭代可接受的响应以查找匹配项
对于(无符号整数i=0;isize();i++){
如果(响应==validInputs->at(i)){
////1) 上述条件始终返回true/////
val=真;
打破
}
}
}
//////////2) 不打印任何东西//////////
println(validInputs->at(0));//注意println方法只是cout3)在这种情况下,使用
at
操作符[]
应该没有显著差异。注意,您有一个指向向量的指针,而不是向量(也不是对向量的引用),因此您必须使用
(*validInputs)[i]
validInputs->operator[](i)
使用运算符重载。如果不想使用其他任何一种方法,使用
validInputs->at(i)
都可以。(如果参数超出数组边界,则
at
方法将引发异常,而
运算符[]
方法在参数超出数组边界时具有未定义的行为。由于
运算符[]
跳过边界检查,如果知道
i
在向量的边界内,则速度更快。如果不确定,请使用
at
并准备捕获异常。)

4) 指针是好的,但引用会更好。如果您不在方法中修改向量,那么对常量向量的引用将是最好的(
std::vector const&
)。这可以确保不会向您传递空指针(引用不能为空),同时还可以确保不会意外修改向量

5) 通常是这样。
i++
是后增量,这意味着必须复制原始值,然后增加
i
,并返回原始值的副本。
++i
增加
i
,然后返回
i
,因此通常速度更快,尤其是在处理复杂迭代器时一个
unsigned int
编译器应该足够聪明,能够意识到预增量是可以的,但是如果您不需要
i
的原始未加增量值,那么使用
at
操作符[]
在这种情况下。请注意,您有一个指向向量的指针,而不是向量(也不是对向量的引用),因此您必须使用
(*validInputs)[i]
validInputs->operator[](i)
来使用操作符重载。如果您不想使用其他任何一种方法,使用
validInputs->at(i)
都可以。(如果参数超出数组边界,
at
方法将抛出异常,而
运算符[]
方法在参数超出数组边界时具有未定义的行为。因为
运算符[]
跳过边界检查,如果知道
i
在向量的边界内,则速度更快。如果不确定,请使用
at
并准备捕获异常。)

4) 指针是好的,但引用会更好。如果您不在方法中修改向量,那么对常量向量的引用将是最好的(
std::vector const&
)。这可以确保不会向您传递空指针(引用不能为空),同时还可以确保不会意外修改向量


5) 通常是这样。
i++
是后增量,这意味着必须复制原始值,然后增加
i
,并返回原始值的副本。
++i
增加
i
,然后返回
i
,因此通常速度更快,尤其是在处理复杂迭代器时一个
unsigned int
编译器应该足够聪明,能够意识到预增量就可以了,但是如果您不需要原始的未加增量的
i

值来回答问题1和2,我们可能需要更多的信息,比如:您是如何初始化的validInputs?问的来源是什么

3) 首先取消引用指针,然后索引向量:

(*validInputs)[i]
4) 引用被认为是更好的样式。尤其是代替从不为空的指针


5) 对于整数,这无关紧要(除非计算表达式的结果)。对于其他对象,使用重载的++运算符(例如迭代器)使用++i可能更好。但实际上,对于++运算符的内联定义,它可能会优化为相同的代码。

要回答问题1和2,我们可能需要更多信息,例如:您是如何初始化validInputs的?ask的来源是什么

3) 首先取消引用指针,然后索引向量:

(*validInputs)[i]
4) 引用被认为是更好的样式。尤其是代替从不为空的指针

5) 对于整数,这无关紧要(除非您计算表达式的结果)。对于其他对象,对于重载的++运算符(例如迭代器),使用++i可能更好。但实际上,对于内联定义i
ask(std::string const& question, std::vector<std::string> const& validInputs)