01/10/2018, 11:16

Cần giải thích về vòng for lạ và tham chiếu hàm

Em thấy rất nhiều bài về string họ có viết 1 vòng for dạng như sau:

bool test(std::string inputString) {
    vector<int> cnt(26,0);
    for(char c:inputString) cnt[c-'a']++;
....................
}

Cái vòng for trên nó hoạt động sao vậy mong mọi người chỉ giúp.
Tiện thể cho em hỏi hàm trả về tham chiếu có phải là tham chiếu đến đối tượng trả về đúng không?
Em nghĩ nó nhằm thay đổi đối tượng trả về nhưng em đọc tài liệu trên mạng thì thấy ghi là trả về tham chiếu nhằm thay đổi đối tượng khác là sao vậy.
Chính xác trên mạng họ nói thế này:"Trả về giá trị thì làm sao nó tiếp tục thay đổi được cái khác ? Trả về tham trị chỉ là 1 giá trị thôi.

  • Trả về tham chiếu hay con trỏ đều như nhau -> để làm gì -> để từ đối tượng gọi hàm đó nó còn có thể thay đổi của những thằng khác nữa"
    Ví dụ em có lớp phân số:
using namespace std;
	class PS {
		private:
			int ts,ms;
		public:
			friend istream& operator>>(istream &is,PS &u);
			PS operator+(PS u);
	istream& operator>>(istream &is,PS &u) {
		is>>u.ts>>u.ms;
		return is;
	}
	PS PS::operator+(PS u) {
		PS temp;
		temp.ts=ts*u.ms+u.ts*ms;
		temp.ms=ms*u.ms;
		return temp;
	}

Tại sao operator+ không trả về tham chiếu mà vẫn tính được: ps1+ps2+ps3;
còn operator>> phải trả về tham chiếu mới nhập được nhiều phân số liên tiếp:

cin>>ps1>>ps2;

Em đọc hết mấy topic hàm trả về tham chiếu rồi mà vẫn không hiểu cho lắm.

HK boy viết 13:32 ngày 01/10/2018

Đậu mè, đó là cú pháp của C++11 đó.
Vòng for đó tương đương với

for (mỗi kí tự c thuộc inputString) cnt[c - 'a']++;

hàm trả về tham chiếu có phải là tham chiếu đến đối tượng trả về đúng không?

Câu này gây bối rối quá Cho ví dụ cụ thể bạn ơi :v

rogp10 viết 13:32 ngày 01/10/2018
  1. Bạn hình dung nó như foreach char c in inputString (đọc to) vấn đề là code này không ổn

  2. Bạn trả về tham chiếu của đối tượng, chứ có phải đối tượng đâu nên không thể nói “đối tượng trả về” :v

Em nghĩ nó nhằm thay đổi đối tượng trả về nhưng em đọc tài liệu trên mạng thì thấy ghi là trả về tham chiếu nhằm thay đổi đối tượng khác là sao vậy.

đọc chậm lại.

HK boy viết 13:18 ngày 01/10/2018

vấn đề là code này không ổn

Code chạy ổn mà anh.

wandbox.org

[Wandbox]三へ( へ՞ਊ ՞)へ ハッハッ

#include #include using namespace std; int main() { string s = "Hello"; for(char c:s) cout << c << endl; }

Trần Hoàn viết 13:29 ngày 01/10/2018

Tại sao lại có cái thứ cú pháp kỳ quặc thế nhỉ

for each (char c in inputString)
	 cnt[c - 'a'] += 1;

Sáng sủa hơn bao nhiêu.

rogp10 viết 13:17 ngày 01/10/2018

Code chạy ổn mà anh.

Code của thớt chưa xét [A-Z] với [a-z].

HK boy viết 13:28 ngày 01/10/2018

Code của thớt còn sáng chán, code ở đây còn dị hơn: http://en.cppreference.com/w/cpp/algorithm/for_each

Dark.Hades viết 13:26 ngày 01/10/2018

Code của thớt còn sáng chán, code ở đây còn dị hơn: http://en.cppreference.com/w/cpp/algorithm/for_each

Hàm này là bộ hàm trong algorithm, ít thấy xài vì cú pháp kiểu khó nhớ so với ngôn ngữ khác

@thớt
Thường thì người ta xài tham chiếu kiểu:

for ([const] char &c : inputString)
{

}

để giảm đi bước copy.

Black viết 13:29 ngày 01/10/2018

Nhưng em tưởng tham chiếu là 1 bí danh của đối tượng nên nói là đối tượng trả về vẫn đúng chứ anh.

Black viết 13:31 ngày 01/10/2018

Em bê nguyên 1 code của bên codefights sang đây luôn:

bool palindromeRearranging(std::string inputString) {
    int counts[26]={0};
    for(char c: inputString) ++counts[c-'a'];
         int odds = 0;
    for(int i: counts)
          if(i%2)
    ++odds;
    return odds<2;
}

Thấy họ toàn ghi thế.
Tóm lại cái vòng for ấy nó có tác dụng duyệt từng phần tử của mảng đúng không anh.

HK boy viết 13:29 ngày 01/10/2018

Tóm lại cái vòng for ấy nó có tác dụng duyệt từng phần tử của mảng đúng không anh.

–> Đúng.

ủa bạn không đọc các cmt trên sao?

Student X viết 13:19 ngày 01/10/2018

String nhập vào mà có kí tự hoa thì e đoán hàm của bác nghẻo luôn!

Black viết 13:17 ngày 01/10/2018

Em chỉ lấy ví dụ để hỏi cách hoạt động của vòng for ấy thôi.
Còn cái code này em copy của 1 bài nó chỉ cho chuỗi nhập vào gồm những kí tự từ a --> z thôi.

Student X viết 13:33 ngày 01/10/2018

À. vòng for đó của bạn chỉ tương đương với:

for(int i=0; i<strlen(inputString); i++){
char c = inputString[i];

}

Em đoán như thế ạ!

Dark.Hades viết 13:21 ngày 01/10/2018

strlen(inputString)

std::string không phải char

Student X viết 13:32 ngày 01/10/2018

à vâng. em biết ạ. do em code thuần C. nên cũng k rõ bên C++ get char at kiểu gì. cái đó em viết bên C ạ!

rogp10 viết 13:28 ngày 01/10/2018

Nhưng em tưởng tham chiếu là 1 bí danh của đối tượng nên nói là đối tượng trả về vẫn đúng chứ anh.

Vậy bạn đã hiểu ra vấn đề :v

Tại sao operator+ không trả về tham chiếu mà vẫn tính được: ps1+ps2+ps3;
còn operator>> phải trả về tham chiếu mới nhập được nhiều phân số liên tiếp:

Có thể private luôn cả constructor mà chỉ để 1 cin và 1 cout tồn tại thôi.

Bài liên quan
0