首页   注册   登录
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
Coding
V2EX  ›  程序员

C++的 Vector 容器中 string 类型元素可否用一种指针替代它?

  •  
  •   kirara · 87 天前 · 1257 次点击
    这是一个创建于 87 天前的主题,其中的信息可能已经有所发展或是发生改变。

    代码目的是把迭代器第一个 string 类型元素的第一段不包括空格的字符全改为大写。
    期望输出:SOME string oh
    实际输出:SOME string oh
    代码输出确实是正确的,但是总觉得代码里太多解引用(*it)写起来很繁琐,不知道大佬们怎么解决。如题。

    #include <iostream>
    #include <string>
    #include <vector>
    using namespace std;
    int main()
    {
    	vector<string> s{ "some string"," oh" };
    	for (auto it = s.begin(); it != s.end() && !it->empty(); ++it) {
    		if (it == s.begin()) { //想把(*it)改成字符串直接使用;
    			for (decltype((*it).size()) index = 0; index != (*it).size() && !isspace((*it)[index]); index++) {
    				(*it)[index] = toupper((*it)[index]);
    			}
    		}
    		cout << (*it) << " ";
    	}
    	return 0;
    }
    
    10 回复  |  直到 2019-09-20 08:51:14 +08:00
        1
    littlespider89   87 天前
    为啥不用指针写法 it->size()
        2
    mind3x   87 天前 via Android
    既然是只处理第一个 string,没看懂外面一圈 for 是拿来干嘛的
        3
    kirara   87 天前 via Android
    @mind3x 写着玩的,别在意
        4
    inhzus   87 天前 via Android
    这个代码的可读性真的震惊到我了…果然对 c++来说 一千个人心中有一千个哈姆雷特。
    1. 既然只处理第一个,判断不为空,直接取 s[0] 不久好了吗。
    2. 第二个循环既然和 index 的位置无关,用 ranged-based for 不也会让代码简洁很多吗。
    3. 大家写 c++ 也会像楼主这样把 size_type 用 decltype 进行 type deduction 吗?这个写法虽然没问题,不过感觉不符合我的习惯…
        5
    aijam   87 天前
    for (auto &str: s) {
    for (auto it = str.begin(); it != str.end() && !isspace(*it); it++) {
    *it = toupper(*it);
    }
    cout << str << " ";
    }
        6
    wbing   87 天前
    ```
    if(s.size() == 0) return -1;
    std::stringstream ss(s[0]);
    std::string str;
    if(ss >> str)
    {
    auto index = s[0].find_first_of(str);
    std::transform(str.begin(),str.end(),str.begin(),::toupper);
    s[0].replace(index,str.size(),str);
    }
    ```
        7
    lishunan246   87 天前 via Android   ♥ 2
    这里就两个 for 循环,一个用 iterator,一个用 index ;一个用++i,一个用 i++。
    size_t 写成 decltype((*it).size())。
    《如何把你写 c++的朋友气到脑中风》
        8
    tianshilei1992   87 天前
    这样如何?
    ```C++
    #include <iostream>
    #include <string>
    #include <vector>

    using namespace std;

    inline void func(vector<string> &vec) {
    if (vec.empty()) {
    return;
    }

    auto& str = vec.front();

    for (auto itr = str.begin(); *itr != ' ' && itr != str.end(); ++itr) {
    *itr = toupper(*itr);
    }
    }

    int main(int argc, char *argv[]) {
    vector<string> vec = {"some string", " oh"};
    func(vec);

    for (const auto& str : vec) {
    cout << str << ' ';
    }

    cout << endl;

    return 0;
    }
    ```
        9
    tianshilei1992   87 天前
    @tianshilei1992 Hot fix:
    #include <iostream>
    #include <string>
    #include <vector>

    using namespace std;

    inline void func(vector<string> &vec) {
    if (vec.empty()) {
    return;
    }

    auto& str = vec.front();

    for (auto itr = str.begin(); itr != str.end() && *itr != ' '; ++itr) {
    *itr = toupper(*itr);
    }
    }

    int main(int argc, char *argv[]) {
    vector<string> vec = {"some string", " oh"};
    func(vec);

    for (const auto& str : vec) {
    cout << str << ' ';
    }

    cout << endl;

    return 0;
    }
        10
    jmc891205   86 天前
    你可能想要 range-based for loop
    for (auto str: s) {cout << str << endl;}
    关于   ·   FAQ   ·   API   ·   我们的愿景   ·   广告投放   ·   感谢   ·   实用小工具   ·   947 人在线   最高记录 5043   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.3 · 24ms · UTC 18:44 · PVG 02:44 · LAX 10:44 · JFK 13:44
    ♥ Do have faith in what you're doing.