C++ 使用.at(int)检查字符串是否只包含唯一字符

C++ 使用.at(int)检查字符串是否只包含唯一字符,c++,C++,这是个很基本的问题,但我搞不懂。我的程序通过将数组中每个ASCII的标志设置为true(如果在字符串中找到)来检查字符串是否唯一。它不起作用(它编译了,但没有给出正确的答案),我一辈子也弄不明白为什么 我得到的输出是0: main.cpp #include "main.hpp" #include <iostream> bool isUnique(std::string str) { if(str.length() > 128) return fals

这是个很基本的问题,但我搞不懂。我的程序通过将数组中每个ASCII的标志设置为true(如果在字符串中找到)来检查字符串是否唯一。它不起作用(它编译了,但没有给出正确的答案),我一辈子也弄不明白为什么

我得到的输出是0:

main.cpp

#include "main.hpp"
#include <iostream>

bool isUnique(std::string str) {

    if(str.length() > 128)
        return false;

    bool theChars[128];

    for(int i = 0; i < str.length(); i++) {
        int loc = str.at(i);

        if(theChars[loc])
            return false;
        else
            theChars[loc] = true;
    }

    return true;
}

int main() {

    std::string timmy = "abcdefghijklmnop";
    std::cout << isUnique(timmy);

    return 0;
}
#包括“main.hpp”
#包括
bool是唯一的(std::string str){
如果(str.length()>128)
返回false;
布尔特查尔[128];
对于(int i=0;istd::cout您忘记初始化布尔数组:

bool theChars[128] = {};
空的初始值设定项表示“使用默认值”,该值为零,也就是bool的false


另外,如果[0,127]之外有任何字符,则代码会产生未定义的行为。您可以通过将
字符设置为256长,并在索引之前将字符强制转换为
uint8\t
。或者使用
std::array
theChars.at(loc)来修复此问题
在超出范围时引发异常。

您忘记初始化布尔数组:

bool theChars[128] = {};
空的初始值设定项表示“使用默认值”,该值为零,也就是bool的false


另外,如果[0,127]之外有任何字符,则代码会产生未定义的行为。您可以通过将
字符设置为256长,并在索引之前将字符强制转换为
uint8\t
。或者使用
std::array
theChars.at(loc)来修复此问题
在超出范围时抛出异常。

更简单的方法是使用
设置

#include <iostream>
#include <set>
using namespace std;
bool isUnique(string str) {
    set<char>st(str.begin(),str.end());
    if(st.size()==str.size())
        return true;
    return false;
}

int main() {

    string timmy = "abcdefghijklmnop";
    cout << boolalpha<<isUnique(timmy)<<endl;
    timmy = "aaaaabbbcdefghijklmnop";
    cout << boolalpha<<isUnique(timmy)<<endl;
    return 0;
}
#包括
#包括
使用名称空间std;
bool是唯一的(字符串str){
setst(str.begin(),str.end());
如果(标准尺寸()==标准尺寸())
返回true;
返回false;
}
int main(){
字符串timmy=“abcdefghijklmnop”;

cout更简单的方法是使用
set

#include <iostream>
#include <set>
using namespace std;
bool isUnique(string str) {
    set<char>st(str.begin(),str.end());
    if(st.size()==str.size())
        return true;
    return false;
}

int main() {

    string timmy = "abcdefghijklmnop";
    cout << boolalpha<<isUnique(timmy)<<endl;
    timmy = "aaaaabbbcdefghijklmnop";
    cout << boolalpha<<isUnique(timmy)<<endl;
    return 0;
}
#包括
#包括
使用名称空间std;
bool是唯一的(字符串str){
setst(str.begin(),str.end());
如果(标准尺寸()==标准尺寸())
返回true;
返回false;
}
int main(){
字符串timmy=“abcdefghijklmnop”;
库特
这不会使用任何额外的空间,并且适用于任何字符编码


这不使用任何额外的空间,适用于任何字符编码。

字符串“唯一”是什么意思?非静态局部变量不会自动初始化,它们的值将是不确定的。这包括数组及其元素。@juanchopanza从代码中可以看出,“唯一”是指“你在寻找长度吗?字符串“唯一”意味着什么?非静态局部变量不会自动初始化,它们的值将是不确定的。这包括数组及其元素。@juanchopanza从代码中可以看出,“唯一”意味着“你想要的长度可能是多少?很好,看起来更干净。它仍然是O(n)时间和O(1)空间吗?我还没有用过一组,但它看起来是waytime-
n log(n)
where
n=std::distance(first,last)
一般来说,如果范围已排序,则N为线性。set和friends通常使用某种自平衡二叉树来实现,因此您可以安全地假设所需的内存量为O(N)很好,看起来更干净。仍然是O(N)时间和O(1)空间吗?我没有使用set,但它看起来是waytime-
N log(N)
其中
N=std::distance(first,last)
通常,如果范围已排序,则N为线性。set和friends通常使用某种自平衡二叉树实现,因此可以安全地假设所需的内存量为O(N)